我有一个简单的序列化器:
class OrderSerializer(serializers.ModelSerializer):
class Meta:
model = Order
fields = [field.name for field in model._meta.fields]
# depth = 1
extra_kwargs = {'created_by': {'default': serializers.CurrentUserDefault()}}
[这两种方式都起作用-我可以列出Order
,也可以创建Order
。
如您所见,created_by
设置为默认用户,而无需指定depth
即可使用。创建对象时指定depth
时,DRF
返回错误:
列“ created_by_id”中的空值违反了非空约束
我知道这是因为现在created_by
被序列化为user
,但是在创建对象时不知道如何使其工作。
您收到此错误的原因是,深度是读取串行器的属性。例如
使用深度为1的序列化器的嵌套表示将看起来像
{ 'order_id': 1
'created_by': { {'id': 1, 'name': 'hello', 'email': '[email protected]'} }
} # created_by object is fully serialized and not just the id
现在这对于读取是有意义的,但是当使用深度为1的序列化程序将其发布到端点时,客户端将需要发布完整的用户对象(它本身不会这样做。您需要为此实现自定义逻辑并变得非常繁琐,例如,如果用户对象)
您有几个选择
我建议使用2个不同的序列化器进行读取和创建。
您可以维护相同的序列化器,并省略depth attr,允许您发布和读取该序列化器,但需要从客户端对整个用户对象进行额外的http请求。
您可以发挥创造力并实现一些逻辑,这些逻辑可以根据http方法更改深度。