gpt4 book ai didi

python - DRF - 将深度=1 添加到模型序列化器不再允许我发布

转载 作者:行者123 更新时间:2023-12-02 05:15:20 24 4
gpt4 key购买 nike

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

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()}}

这两种方式都有效 - 我可以列出订单,也可以创建订单

如您所见,created_by 设置为默认用户,无需指定深度即可工作。当我在创建对象时指定深度时,DRF返回错误:

null value in column "created_by_id" violates not-null constraint

我知道这是因为现在 created_by 被序列化为 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 上分配它。可能还有 PATCH 和 PUT 的附加逻辑。只是不建议这样做)

您有几个选择

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

  2. 您可以维护相同的序列化器并省略深度属性,从而允许您发布和读取它,但需要从客户端为整个用户对象发出额外的 http 请求。

  3. 您可以发挥创意并实现一些根据 http 方法改变深度的逻辑。

关于python - DRF - 将深度=1 添加到模型序列化器不再允许我发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58644572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com