Редактировать поля перед созданием с помощью ModelSerializer

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

С почтальоном, когда я 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 ответ

Решение

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

Другие вопросы по тегам