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方法更改深度