首页 > 解决方案 > 使用 Django Rest Framework 自动引用嵌套

问题描述

我在 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)?

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

{
   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,
   },
}

标签: pythondjangoapirestdjango-rest-framework

解决方案


  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)
    

推荐阅读