DRF-向模型序列化器添加depth = 1不再允许我进行POST

问题描述 投票:2回答:1

我有一个简单的序列化器:

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,但是在创建对象时不知道如何使其工作。

python django rest django-rest-framework
1个回答
2
投票

您收到此错误的原因是,深度是读取串行器的属性。例如

使用深度为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的序列化程序将其发布到端点时,客户端将需要发布完整的用户对象(它本身不会这样做。您需要为此实现自定义逻辑并变得非常繁琐,例如,如果用户对象)

您有几个选择

  1. 我建议使用2个不同的序列化器进行读取和创建。

  2. 您可以维护相同的序列化器,并省略depth attr,允许您发布和读取该序列化器,但需要从客户端对整个用户对象进行额外的http请求。

  3. 您可以发挥创造力并实现一些逻辑,这些逻辑可以根据http方法更改深度。

© www.soinside.com 2019 - 2024. All rights reserved.