【问题标题】:DRF - adding depth=1 to model serializer no longer allows me to POSTDRF - 将 depth=1 添加到模型序列化程序不再允许我发布
【发布时间】:2020-02-26 21:15:25
【问题描述】:

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

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

这两种方式都适用 - 我可以列出 Orders 并创建一个 Order

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

“created_by_id”列中的空值违反非空约束

我知道这是因为现在 created_by 被序列化为 user 但不知道如何在创建对象时使其工作。

【问题讨论】:

    标签: python django rest django-rest-framework


    【解决方案1】:

    您收到此错误的原因是因为深度是用于读取序列化程序的属性。例如

    使用深度为 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 方法改变深度的逻辑。

    【讨论】:

      猜你喜欢
      • 2019-08-28
      • 1970-01-01
      • 2018-05-24
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多