在使用 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
我创建了一个 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