如何使用 python DRF 在 JSON 响应下方创建此内容

How to create this below JSON response using python DRF

由于我是这个 DRF 的新手,所以我在创建这个 JSON 时遇到了一些困难。我创建了一个 API 端点,该 API 端点的输出现在如下所示

  "meta": {
    "limit": 1,
    "page_count": 1,
    "total_count": 1
  },
  "results": {
    "id": 1234567,
    "curriculum": {
      "ES Math": [
        {
          "grade_level": "ES",
          "subject": "Math",
          "subject_abbr": "Math",
          "product_id": 438,
          "product_title": "Test1",
          "ratings": [
            {
              "source": "A",
              "report_url": "********",
              "Org1_rating": [
                {
                  "name": "green_alignment_ratings",
                  "value": 12,
                  "label": "Meet Expectations",
                  "label_color": "Green"
                },
                {
                  "name": "green_usability_ratings",
                  "value": 12,
                  "label": "Meet Expectations",
                  "label_color": "Green"
                }
              ],
              "Org2_rating": [
                {
                  "name": "Overall",
                  "value": null,
                  "label": "Tier 1: Exemplifies Quality",
                  "label_color": null
                }
              ]
            }
          ]
        },
        {
          "grade_level": "ES",
          "subject": "Math",
          "subject_abbr": "Math",
          "product_id": 2085,
          "product_title": "Test2",       
          "ratings": [
            {
              "source": "A",
              "report_url": "********",
              "Org1_rating": [
                {
                  "name": "green_alignment_ratings",
                  "value": 12,
                  "label": "Meet Expectations",
                  "label_color": "Green"
                },
                {
                  "name": "green_usability_ratings",
                  "value": 12,
                  "label": "Meet Expectations",
                  "label_color": "Green"
                }
              ],
              "Org_rating2": "null"
            }
          ]
        }
      ]
    }
  }
}

但我希望输出是下面这种格式

{
  "meta": {
    "limit": 1,
    "page_count": 1,
    "total_count": 1
  },
  "results": {
    "id": 1234567,
    "curriculum": {
      "ES Math": [
        {
          "grade_level": "ES",
          "subject": "Math",
          "subject_abbr": "Math",
          "product_id": 438,
          "product_title": "Test1",
          "ratings": [
            {
              "review_org": "Org1",
              "review_url": "url",
              "review_items": [
                {
                  "name": "green_alignment_ratings",
                  "value": 14,
                  "label": "Meets Expectations",
                  "label_color": "Green"
                },
                {
                  "name": "green_usability_ratings",
                  "value": 34,
                  "label": "Green",
                  "label_color": 38
                }
              ]
            },
            {
              "review_org": "Org2",
              "review_url": "url",
              "review_items": [
                {
                  "name": "Overall",
                  "value": null,
                  "Label": "Tier I, Exemplifies quality",
                  "scale": null
                }
              ]
            }
          ]
        },
        {
          "grade_level": "ES",
          "subject": "Math",
          "subject_abbr": "Math",
          "product_id": 2085,
          "product_title": "Test2",
          "ratings": [
            {
              "review_org": "Org1",
              "review_url": "url",
              "review_items": [
                {
                  "name":"green_alignment_ratings",
                  "value": 14,
                  "label": "Meets Expectations",
                  "label_color": "Green"
                },
                {
                  "name":"green_usability_ratings",
                  "value": 34,
                  "label": "Meets Expectations",
                  "label_color": "Green"
                }
              ]
            },
            {
              "review_org": "Org2",
              "review_url": "url",
              "review_items": []
            }
          ]
        }
      ]
    }
  }
}

我用下面的序列化程序尝试了一些东西,但这只会产生一些不同的东西 JSON。


class CurriculumSerializer(ModelSerializer):
    grade_level = serializers.CharField(source='grade_level_dim')
    subject_abbr = serializers.CharField(source='subject_abbr_dim')
    product_id = serializers.IntegerField(source='dim_id')
    product_title = serializers.CharField(source='title_dim')
    ratings = serializers.SerializerMethodField()
    
    
    class Meta:
        model = Table2
        fields = [
            'grade_level',
            'subject',
            'subject_abbr',
            'product_id',
            'product_title',
            'ratings'
        ]


    def get_ratings(self,obj):
        queryset = Table2.objects.all()
        c = queryset.filter(id=obj.id, title_dim = obj.title_dim, ratings_source__isnull=False).distinct('id',)
        if c.exists():
            serializer = RatingsSerializer(c, many=True)
            return serializer.data
        else:
            data = 'null'
            return data
    
class RatingsSerializer(ModelSerializer):
    review_items = serializers.SerializerMethodField()
    Louisiana_rating = serializers.SerializerMethodField()
    class Meta:
        model = Table3
        fields = ['source','report_url','review_items','Louisiana_rating']
        
    def get_review_items(self, obj):
        queryset = Table3.objects.all()
        c = queryset.filter(source__iexact = 'Org1', title = obj.title_dim, grade_level = obj.grade_level, subject_abbr = obj.subject_abbr_dim)
        # print(c.query)
        if c.exists():
            serializer = reportSerializer(c, many=True)
            return serializer.data
        else:
            data = 'null'
            return data
        
    def get_Louisiana_rating(self, obj):
        queryset = Table3.objects.all()
        c = queryset.filter(source__iexact = 'Org2', title = obj.title_dim, grade_level = obj.grade_level, subject_abbr = obj.subject_abbr_dim)
        if c.exists():
            serializer = reportSerializer(c, many=True)
            return serializer.data
        else:
            data = 'null'
            return data
        
class reportSerializer(ModelSerializer):
    class Meta:
        model = Table3
        fields = ['name', 
                  'value', 
                  'label', 
                  'label_color']

class DistrictDetailSerializer(ModelSerializer):
    curriculum = serializers.SerializerMethodField()

    class Meta:
        model = Table1
        exclude = ('finance_total', 'revenue_total')

    def get_curriculum(self, obj):
        queryset_list = Table2.objects.all()
        c = queryset_list.filter(id=obj.id)\
            .distinct('col1','col2')
        if c.exists():       
            serializer = CurriculumSerializer(c, many=True)
            curriculum_map = {}
            for d in serializer.data:
                key = f"{d['grade_level']} {d['subject_abbr']}"            
                if key in curriculum_map:
                    curriculum_map[key].append(d)
                else:
                    curriculum_map[key] = [d, ]
            return curriculum_map
        else:
            data = 'null'
            return data

表 3 包含评级的所有详细信息,例如来源、report_url、名称、标签、值,label_colour 我希望这些值显示在下面的 JSON 中。

如果用户帐户不是 given/assigned VM 上的虚拟机用户登录角色,通常会发生此错误。 请检查此 https://docs.microsoft.com/en-us/azure/active-directory/devices/howto-vm-sign-in-azure-ad-windows#azure-role-not-assigned 以分配所需的角色并尝试登录。