Редактировать поля перед созданием с помощью ModelSerializer - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть поддон с содержимым внутри.Мне нужно присвоить палете конкретный номер на основе значения внешнего ключа (но этого пока нет в коде).

С почтальоном, когда я POST с каким-то телом json;

  1. Если я даю какое-то поле с номером, то получаю ошибку, что номер не может быть дублирован.
  2. Если я не отправляю номер (потому что я даю его по настроенному методу создания)), Я получаю сообщение об ошибке, что число является обязательным полем.
  3. Если я удаляю число из PalletSerializer, оно сохраняет, но когда мне нужно его получить, номер не отображается.

Как правильно добавить данные перед созданием?Вот сериализаторы:

class ContentSerializer(serializers.ModelSerializer):    

    class Meta:
        model = models.Content
        fields = ('id', 'quantity', 'kilograms', 'container')

class PalletSerializer(serializers.ModelSerializer):
    contents = ContentSerializer(many=True)

    class Meta:
        model = models.Pallet
        fields = ('id', 'number', 'receipt_waybill', 'client', 'contents',)

    def create(self, validated_data):
        contents_data = validated_data.pop('contents')
        number = 123456
        pallet = models.Pallet.objects.create(number=number, **validated_data)
        for content_data in contents_data:
            specifications_data = content_data.pop('specifications')
            instance = models.Content.objects.create(pallet=pallet, **content_data)
            instance.specifications.set(specifications_data)

        return pallet

1 Ответ

0 голосов
/ 25 февраля 2019

В поле number можно установить значение только для чтения .Вы можете достичь этого, либо определив поле вручную с помощью number = serializers.IntegerField(read_only=True) в вашем PalletSerializer или определив read_only_fields = ('number',) в вашем сериализаторе class Meta.

...