在使用 DRF python 为 API 创建 JSON 响应时面临挑战

facing challenges in creating JSON response for API using DRF python

我创建了一个 API,它从数据库中获取数据并以下面的格式给我这个输出 JSON

{
    "curriculum": 
    [
            {
                "id": "1",
                "grade_level": "ES",
                "subject": "ELA",
                "subject_abbr": "ELA",
                "product_id": 446,                
                "series_title": "",
            },
            {
                "id": "2",
                "grade_level": "ES",
                "subject": "ELA",
                "subject_abbr": "ELA",
                "product_id": 446,
                "series_title": "",
            },
            {
                "id": "3",
                "grade_level": "ES",
                "subject": "Math",
                "subject_abbr": "Math",
                "product_id": 235,
                "series_title": "",
            },
            {
                "id": "4",
                "grade_level": "ES",
                "subject": "Math",
                "subject_abbr": "Math",
                "product_id": 235,                
                "series_title": "",
            }
    ]
}

但我需要我的输出采用以下格式。

{
    "curriculum": 
    {
        "ES ELA": [
            {
                "id": "1",
                "grade_level": "ES",
                "subject": "ELA",
                "subject_abbr": "ELA",
                "product_id": 446,                
                "series_title": ""
            },
            {
                "id": "2",
                "grade_level": "ES",
                "subject": "ELA",
                "subject_abbr": "ELA",
                "product_id": 446,
                "series_title": ""
            }],
        "ES Math": [    
            {
                "id": "3",
                "grade_level": "ES",
                "subject": "Math",
                "subject_abbr": "Math",
                "product_id": 235,
                "series_title": ""
            },
            {
                "id": "4",
                "grade_level": "ES",
                "subject": "Math",
                "subject_abbr": "Math",
                "product_id": 235,                
                "series_title": ""
            }
        ]   
    }
}

请在下面找到序列化程序

class DetailSerializer(ModelSerializer):
    people = serializers.SerializerMethodField()
    curriculum = serializers.SerializerMethodField()
    finance = serializers.SerializerMethodField()

    class Meta:
        model = table_main
        fields = '__all__'

    def get_people(self, obj):
        queryset_list = peopletable.objects.all()
        c = queryset_list.filter(id=obj.id)
        serializer = ContactSerializer(c, many=True)
        return serializer.data

    def get_curriculum(self, obj):
        queryset_list = curriculumtable.objects.all()
        c = queryset_list.filter(id=obj.id)
        serializer = CurriculumSerializer(c, many=True)
        return serializer.data

    def get_finance(self, obj):
        queryset_list = finances.objects.all()
        c = queryset_list.filter(id=obj.id).order_by('year').reverse()[:1]
        serializer = FundingsSerializer(c, many=True)
        return serializer.data

在预期的输出中,“ES ELA”和“ES Math”不过是 grade_level 和 subject_abbr 值。我也尝试使用嵌套的序列化程序,但没有用。请帮助我,我该怎么做。

您可以在 get_curriculum 中执行此操作:

    def get_curriculum(self, obj):
        ...
        curriculum_map = {}
        for c in serializer.data:
            key = f"{c['grade_level']} {c['subject_abbr']}"
            if key in curriculum_map:
                curriculum_map[key].append(c)
            else:
                curriculum_map[key] = [c, ]
        return curriculum_map

或覆盖to_representation:

class DetailSerializer(ModelSerializer):
    ...
    def to_representation(self, instance):
        representation = super().to_representation(instance)
        curriculum_map = {}
        for c in representation['curriculum']:
            key = f"{c['grade_level']} {c['subject_abbr']}"
            if key in curriculum_map:
                curriculum_map[key].append(c)
            else:
                curriculum_map[key] = [c, ]
        representation['curriculum'] = curriculum_map
        return representation