Django递归序列化

2024-09-30 16:38:35 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这样的模型:

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

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


Tags: 模型truefieldfieldsmodelhereonmodels
1条回答
网友
1楼 · 发布于 2024-09-30 16:38:35

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

class Aserializer(serializers.ModelSerializer):

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

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

相关问题 更多 >