Данные POST Django Serializer не полностью переданы в сериализатор - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть следующее определение сериализатора:

class TestSerializer(serializers.ModelSerializer):
    contexts = serializers.SerializerMethodField()

    class Meta:
        model = Test
        fields = (
            "id",
            "contexts"
        )

    def get_contexts(self, obj):
       return ...

    def create(self, data):
        print('CREATE')
        print(data)
        return super().create(data)

    def update(self, instance, validated_data):
        print('UPDATE')
        print(validated_data)
        return super().update(instance, validated_data)

и в наборе использования такое

serializer_class = TestSerializer
queryset = Test.objects.all()

Обратите внимание, что поле contexts не является полем базы данных.Когда я получаю доступ к конечной точке с помощью GET, я правильно получаю информацию с помощью

 {
     "id": 1,
     "contexts": [{...}]
 }

Но при отправке тех же данных обратно, что и POST, возникают две проблемы.Первый сериализатор, похоже, не способен сопоставить правильный набор данных, так как я всегда оказываюсь в методе create, приводящем к ошибке

duplicate key value violates unique constraint

, а при печати data в методе createконтексты вообще отсутствуют.

1 Ответ

0 голосов
/ 09 ноября 2018

Учитывая, что вы используете ModelViewSet и зарегистрировали его по URL: /api/test/ ...

Запрос POST, такой как описанный вами, действительно попытается создать новую запись с 1 в качестве id. Это невозможно, если запись с id 1 уже существует.

Для обновления вам необходимо отправить PATCH запрос на подробный маршрут. /api/test/1/

EDIT

SerializerMethodField только для чтения и не будет отображаться в validated_data. Вы можете получить к нему доступ в self.context['request'].data.get('contexts'). Но я бы порекомендовал создать еще один сериализатор для поля ...

class ContextsSerializer(serializers.Serializer):
    class Meta:
        fields = (...)

class TestSerializer(serializers.ModelSerializer):
    contexts = ContextsSerializer(many=False)

Это еще не все, если вы хотите, чтобы все было сделано правильно. Не зная точно, что вы пытаетесь сделать и почему, я не хотел бы предлагать полное решение. Но вы можете сделать все, что вы пытаетесь сделать, используя данные, которые не были проверены с request.

...