【问题标题】:Django recursive serializingDjango递归序列化
【发布时间】:2020-10-11 21:01:28
【问题描述】:

假设我有这样的模型:

class A(models.Model):
    ...some fields here

class B(models.Model):
    ...some fields here
    a = models.ForeignKey(A, on_delete=CASCADE)

class C(models.Model):
    ...some fields here
    b = models.ForeignKey(B, on_delete=CASCADE)

...

我希望我的 API 端点返回类似这样的内容

{
  ...some fields here
  b: [
  {
    ...some field here
    c: [{...}, {...} ...]
  },
  {
    ...some field here
    c: [{...}, {...} ...]
  }
  ...
  ]
}

我知道我可以这样做:

class Bserializer(serializers.ModelSerializer):
  c = Cserializer(source="c_set", many=True, read_only=True,)

  class Meta:
      model = B
      fields = [...some fields, "c"]

class Aserializer(serializers.ModelSerializer):
  b = Bserializer(source="b_set", many=True, read_only=True,)

  class Meta:
      model = A
      fields = [...some fields, "b"]

但如果这更深入或/并且模型有更多外键,它开始变得非常复杂。有没有办法递归地添加所有引用模型的实例。

【问题讨论】:

    标签: python django serialization django-rest-framework


    【解决方案1】:

    您可以在序列化程序 Meta 类中指定 depth 值,但是,如果您想自定义嵌套数据的任何部分,这将不起作用,因为这将自动创建模型序列化程序(包含所有字段) 用于嵌套关系。查看文档here

    class Aserializer(serializers.ModelSerializer):
    
      class Meta:
          model = A
          fields = [...some fields, "b"]
          depth = 2
    

    最重要的是,如果您不对嵌套序列化程序进行任何自定义,请使用它,否则,请为每个关系坚持使用自定义序列化程序。但我建议将嵌套数据保持在最低限度,因为它会影响性能

    【讨论】:

      猜你喜欢
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      • 2016-10-27
      • 2016-02-26
      相关资源
      最近更新 更多