【问题标题】:Auto refering nesting with Django Rest Framework使用 Django Rest Framework 自动引用嵌套
【发布时间】:2026-02-13 14:55:01
【问题描述】:

我在 Django 中有这个模型(基于旧数据库):

class NationalTest(models.Model):
    unityId = models.IntegerField(primary_key=True)
    parentId = models.IntegerField(blank=True)
    grade = models.FloatField(blank=True)

此模型存储“统一”(我国的一所学校、一个城市、一个地区或一个州)在全国考试中获得的成绩。 unityId是unity的id,grade是它的考试成绩,parentId是它的上父id(即:如果我们的unity是学校,parentId是所在城市的id学校所在的位置;如果是城市,parentId 是城市所在州的 id,依此类推)。

出于前端的目的,当我获取某个学校的成绩时,我还需要城市、州、地区和整个国家的成绩(所有 5 个级别都可能)。当我获取一个城市的等级时,我还需要州、地区和国家的等级。当我获取州的等级时,只需要等级以上的两个等级。

我认为我可以解决它的最好方法是创建一个基于parentId 的嵌套序列化程序。我知道当我们有来自另一个模型的外键时该怎么做,但是当外键在同一个模型中时我该怎么做(即:它是unityId)? p>

我需要这样的东西来获取:

{
   unityId: 2393044, // It is a school
   parentId: 239, // In this case, it is a city
   grade: 7.3,
   city: {
      unityId: 239
      parentId: 23
      grade: 8.2,
   },
   state: {
      unityId: 23
      parentId: 2
      grade: 7.5,
   },
   region: {
      unityId: 2
      parentId: 1
      grade: 7.9,
   },
   country: {
      unityId: 1
      parentId: null
      grade: 7.7,
   },
}

【问题讨论】:

  • 你为什么不使用外键来访问 parentId?@André Carvalho
  • @EliakinCosta 如果它是旧数据库,它可以工作吗?
  • 是的,它有效。您应该查看 inspectdb 以了解更多详细信息。

标签: python django api rest django-rest-framework


【解决方案1】:
  1. 您应该必须使用 SerializerMethodField。

    class NationalTestSerializer(serializers.ModelSerializer):
        parent= serializers.SerializerMethodField()
    
        class Meta:
            model = NationalTest
    
        def get_parent(self, obj):
            # get the information of parent.
    
  2. 您可以将 ForeignKey 与自己的模型一起使用

    parentId= models.ForeignKey('self', on_delete=models.CASCADE)
    

【讨论】:

  • SerializerMethodField案例中如何“获取父母信息”?
  • 可以通过以下方式访问parentId。 self.parentId。换句话说,self 指的是当前的模型实例