在使用 ModelSerializer 创建之前编辑字段
Edit fields before create using ModelSerializer
我有一个托盘,里面有东西。我需要根据外键值为托盘分配一个特定的编号(但代码中还没有)。
和邮递员,当我POST和一些jsonbody;
- 如果我给出一些数字字段,然后得到一个数字不能重复的错误。
- 如果我不发送数字(因为我是在自定义创建方法上提供的),我会收到一个错误消息,指出数字是必填字段。
- 如果我从 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
您可以将number
字段设置为只读。您可以通过在 PalletSerializer
中使用 number = serializers.IntegerField(read_only=True)
手动定义字段或在序列化程序的 class Meta
.
中定义 read_only_fields = ('number',)
来实现此目的
我有一个托盘,里面有东西。我需要根据外键值为托盘分配一个特定的编号(但代码中还没有)。
和邮递员,当我POST和一些jsonbody;
- 如果我给出一些数字字段,然后得到一个数字不能重复的错误。
- 如果我不发送数字(因为我是在自定义创建方法上提供的),我会收到一个错误消息,指出数字是必填字段。
- 如果我从 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
您可以将number
字段设置为只读。您可以通过在 PalletSerializer
中使用 number = serializers.IntegerField(read_only=True)
手动定义字段或在序列化程序的 class Meta
.
read_only_fields = ('number',)
来实现此目的