Django DRF - Сериализация различных запросов и ответов - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть конечная точка API, которая запрашивает данные в следующем формате: -

{
  "platform": "value",
  "username": "value",
  "login_type": "value"
}

Теперь у меня есть модель: -

class ModelA(models.Model):
    field1 = models.IntegerField()

Переменные запроса не являются частью модели, поэтому я создаю следующий сериализатор: -

class ModelASerializer(serializers.ModelSerializer):
    username = serializers.CharField()
    login_type = serializers.IntegerField()
    platform = serializers.ChoiceField(choices=User.PLATFORM_CHOICES)

    def create(self, data):
        platform, username = data.get('platform'), data.get('username')
        login_type = data.get('login_type')
        ###### some processing based on above input
        instance = ModelA.objects.create(field1=11111)
        return instance

    class Meta:
        model = ModelA
        fields = ('username', 'login_type', 'platform')
        read_only_fields = ('field1', )

Когда я POST данных, ошибка возвращается обратно

The serializer field might be named incorrectly and not match any attribute or key on the `ModelA` instance.
Original exception text was: 'ModelA' object has no attribute 'username'.

Я понимаю, что он пытается get_attr fields из объекта экземпляра. Как отправить ответ, если запрос INPUT отличается (т. Е. Не связан с полями модели), а ответ отличается (т. Е. Связан с полями модели)?

1 Ответ

0 голосов
/ 02 мая 2018

Я решил вышеуказанное поле настроек проблемы как write_only = True.

class ModelASerializer(serializers.ModelSerializer):
    username = serializers.CharField(write_only = True)
    login_type = serializers.IntegerField(write_only = True)
    platform = serializers.ChoiceField(choices=User.PLATFORM_CHOICES, write_only = True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...