【发布时间】:2018-09-04 23:58:29
【问题描述】:
我正在尝试为我的 API 端点创建一个可写的嵌套序列化程序,但是在输入我的父序列化程序的 create 方法后,嵌套数据不会出现在我的 validated_data 字典中,就像它应该在示例中一样 @ 987654321@。相反,嵌套键甚至不存在于字典中。相反,它看起来像:{'foo': 'bar'}。因此,嵌套键似乎被展平,具有相同键的任何其他嵌套对象都将被覆盖。
关于问题可能是什么的任何线索?我有一些相当复杂的验证逻辑,但是在删除所有这些之后,问题没有得到解决,所以它似乎无关紧要。
我的模型是这样定义的:
class Payment(models.Model):
id = models.AutoField(primary_key=True)
foo = models.CharField(max_length=15, blank=True, null=True)
class Booking(models.Model):
id = models.AutoField(primary_key=True)
payment = models.ForeignKey(Payment, blank=True, null=True)
我的序列化器:
class PaymentSerializer(serializers.ModelSerializer):
class Meta:
model = Payment
fields = '__all__'
class BookingSerializer(serializers.ModelSerializer):
payment = PaymentSerializer(source='*', write_only=True)
def create(self, validated_data):
print("Creating booking", validated_data) # Outputs "Creating booking {'foo': 'bar'}"
payment_data = validated_data.pop('payment') # Obviously errors at this point
primary_guest = Payment.objects.create(payment_data)
booking = Booking.objects.create(**validated_data)
# other creation related code
return booking
class Meta:
fields = '__all__'
我的视图集:
class PrebookingViewSet(viewsets.ModelViewSet):
queryset = Booking.objects.all().order_by('id')
serializer_class = BookingSerializer
我的请求包含以下 POST 正文:
{
"payment": {
"foo": "bar"
}
}
【问题讨论】:
-
你在这里期待什么 - 支付下的许多 foos?
-
不,我希望validated_data 字典与文档示例一样嵌套,链接。很像请求正文。我的例子是高度简化的。
标签: python django django-rest-framework