Python Django递归序列化

Python Django递归序列化,python,django,serialization,django-rest-framework,Python,Django,Serialization,Django Rest Framework,假设我有这样的模型: 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)

假设我有这样的模型:

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)

...
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"]
我希望我的API端点返回如下内容

{
  ...some fields here
  b: [
  {
    ...some field here
    c: [{...}, {...} ...]
  },
  {
    ...some field here
    c: [{...}, {...} ...]
  }
  ...
  ]
}
我知道我可以做这样的事情:

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)

...
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"]

但是,如果这一点更深入或者模型有更多的外键,它就会变得非常复杂。是否有一种方法可以递归地添加引用模型的所有实例。

您可以在serializer
Meta
类中指定一个
深度值,但是,如果您想自定义嵌套数据的任何部分,这将不起作用,因为这将自动为嵌套关系创建模型序列化器(具有所有字段)。检查文件

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