Python DRF-将depth=1添加到模型序列化程序不再允许我发布
我有一个简单的序列化程序:Python DRF-将depth=1添加到模型序列化程序不再允许我发布,python,django,rest,django-rest-framework,Python,Django,Rest,Django Rest Framework,我有一个简单的序列化程序: 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.Cur
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()}}
这两种方法都有效-我可以列出订单
s,我可以创建订单
如您所见,有一个由创建的设置为默认用户,它不指定深度
。当我在创建对象时指定depth
时,DRF
返回错误:
列“created_by_id”中的null值违反not null约束
我知道这是因为现在,由
创建的被序列化为user
,但不知道如何在创建对象时使其工作 出现此错误的原因是深度是读取序列化程序的一个属性。比如说
使用深度为1的序列化程序的嵌套表示形式如下
{ 'order_id': 1
'created_by': { {'id': 1, 'name': 'hello', 'email': 'foo@bar.com'} }
} # created_by object is fully serialized and not just the id
现在这对于读取是有意义的,但是当使用深度为1的序列化程序发布到端点时,客户端需要发布完整的用户对象(它本身不会这样做。您需要实现表示查找此用户对象并在POST上分配它的自定义逻辑。可能还有用于修补程序和PUT的附加逻辑。不建议这样做)
您有几个选择
我建议使用2个不同的序列化程序进行读取和创建
您可以维护相同的序列化程序并省略depth attr,从而允许对其进行post和读取,但需要从客户端对整个用户对象发出额外的http请求
您可以发挥创意,实现一些逻辑,根据http方法更改深度