Python Django rest framework可写嵌套序列化程序数据在已验证的\u数据中丢失
我试图为我的API端点创建一个可写的嵌套serialiser,但是在输入我的父serialiser的Python Django rest framework可写嵌套序列化程序数据在已验证的\u数据中丢失,python,django,django-rest-framework,Python,Django,Django Rest Framework,我试图为我的API端点创建一个可写的嵌套serialiser,但是在输入我的父serialiser的create方法时,嵌套数据不会像示例中那样出现在我的validated\u data字典中。相反,嵌套键甚至不存在于字典中。相反,它看起来像:{'foo':'bar'}。因此,嵌套的关键点看起来是展平的,具有相同关键点的任何其他嵌套对象都将被覆盖 关于问题可能是什么,有什么线索吗?我有一些相当复杂的验证逻辑,但是在删掉所有这些之后,问题没有被背诵出来,所以它似乎无关紧要 我的模型定义如下: cl
create
方法时,嵌套数据不会像示例中那样出现在我的validated\u data
字典中。相反,嵌套键甚至不存在于字典中。相反,它看起来像:{'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
我的请求包含以下正文:
{
"payment": {
"foo": "bar"
}
}
问题是你已经定义了
source='*',
从 值
source='*'
具有特殊含义,用于指示整个对象应传递到字段。这对于创建嵌套表示或需要访问完整对象以确定输出表示的字段非常有用
也就是说,您的有效负载{“payment”:{“foo”:“bar”}
将进入PaymentSerializer
而不是{“foo”:“bar”}
解决方案
只需删除
源代码='*'
;)
class BookingSerializer(serializers.ModelSerializer):
payment=PaymentSerializer(仅写=True)
def创建(自我验证的_数据):
#您的代码
在我完成了所有的故障排除之后,我或多或少地偶然发现了问题的解决方案,并在我的问题中给出了一个示例。这是一个很好的锻炼。问题是由嵌套的serialiser字段定义引起的
而不是:
payment = PaymentSerializer(source='*', write_only=True)
我需要:
payment = PaymentSerializer(write_only=True)
Myvalidated_data
字典现在在付款键下包含一个嵌套字典
我不知道为什么我会把它包括进来,我想我已经在其他地方使用过它来将字段分解成嵌套表示。但是,我似乎找不到任何关于它是如何工作的文档,以及它为什么会导致我在这里看到的行为。欢迎对此提出任何意见 在这里,您期望得到什么——支付下有许多FOO?不,我期望验证的\u数据字典与文档示例一样嵌套,链接。很像请求主体。我的例子是高度简化的。没错,谢谢,我只是自己解决了它。关于它为什么会对顶级序列化程序中已验证的_数据产生这种影响,有什么提示吗?这似乎不直观。我认为我提供的链接是不言自明的,不是吗?
payment = PaymentSerializer(write_only=True)