Редактировать поля перед созданием с помощью ModelSerializer
У меня есть поддон с содержимым внутри. Мне нужно присвоить палете конкретный номер, основываясь на значении внешнего ключа (но этого пока нет в коде).
С почтальоном, когда я POST с некоторым телом JSON;
- Если я приведу какое-то поле номера, то получу ошибку, что номер не может быть продублирован.
- Если я не отправляю номер (потому что я даю его по настроенному методу создания), я получаю сообщение об ошибке, что число является обязательным полем.
- Если я удаляю номер из 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
,