DRF - добавление глубины = 1 в сериализатор модели больше не позволяет мне POST - PullRequest
2 голосов
/ 31 октября 2019

У меня есть простой сериализатор:

class OrderSerializer(serializers.ModelSerializer):
   class Meta:
        model = Order
        fields = [field.name for field in model._meta.fields]
        # depth = 1
        extra_kwargs = {'created_by': {'default': serializers.CurrentUserDefault()}}

, который работает в обоих направлениях - я могу перечислить Order с, и я могу создать Order.

Как вы видите, естьcreated_by установить пользователя по умолчанию, который работает без указания depth. Когда я задаю depth при создании объекта, DRF возвращает ошибку:

нулевое значение в столбце "create_by_id" нарушает ненулевое ограничение

Я знаю, чтоэто потому, что теперь created_by сериализуется как user, но не знает, как заставить его работать при создании объектов.

1 Ответ

2 голосов
/ 31 октября 2019

Причина, по которой вы получаете эту ошибку, заключается в том, что глубина является атрибутом для чтения сериализаторов. Например,

вложенное представление с использованием вашего сериализатора с глубиной 1 будет выглядеть так:

{ 'order_id': 1
  'created_by': { {'id': 1, 'name': 'hello', 'email': 'foo@bar.com'} } 
} # created_by object is fully serialized and not just the id 

Теперь это имеет смысл для чтения, но при отправке в конечную точку с использованием сериализатора с глубиной 1клиент должен будет опубликовать полный пользовательский объект (он не будет делать это по своей сути. Вам нужно будет реализовать собственную логику для этого и стать очень логикой, например, если пользовательский объект)

Выесть несколько вариантов

  1. Я рекомендую использовать 2 различных сериализатора для чтения и создания.

  2. Вы можете поддерживать тот же сериализатор и не указывать значение глубины attr, что позволит вам публиковать и читать его, но потребуется выполнить дополнительный http-запрос от клиента для всего объекта пользователя.

  3. Вы можете проявить творческий подход и реализовать некоторую логику, которая изменяет глубину в зависимости от метода http.

...