我有一个像这样的Django模型:
class Sections(models.Model):
section_id = models.CharField(max_length=127, null=True, blank=True)
title = models.CharField(max_length=255)
description = models.TextField(null=True, blank=True)
class Risk(models.Model):
title = models.CharField(max_length=256, null=False, blank=False)
section = models.ForeignKey(Sections, related_name='risks')
class Actions(models.Model):
title = models.CharField(max_length=256, null=False, blank=False)
section = models.ForeignKey(Sections, related_name='actions')
这样的序列化器:
class RiskSerializer(serializers.ModelSerializer):
class Meta:
model = Risk
fields = ('id', 'title',)
class ActionsSerializer(serializers.ModelSerializer):
class Meta:
model = Actions
fields = ('id', 'title',)
class RiskActionPerSectionsSerializer(serializers.ModelSerializer):
risks = RiskSerializer(many=True, read_only=True)
actions = ActionsSerializer(many=True, read_only=True)
class Meta:
model = Sections
fields = ('section_id', 'risks', 'actions')
depth = 1
def to_representation(self, instance):
response_dict = dict()
response_dict[instance.section_id] = {
'actions': HealthCoachingActionsSerializer(instance.actions.all(), many=True).data,
'risks': HealthCoachingRiskSerializer(instance.risks.all(), many=True).data
}
return response_dict
在视图上访问RiskActionPerSectionSerializer时,我得到以下输出:
[
{
"section 1": {
"risks": [],
"actions": []
}
},
{
"section 2": {
"risks": [],
"actions": []
}
},
.....
]
没关系,但我更愿意这样做:
[
"section 1": {
"risks": [],
"actions": []
},
"section 2": {
"risks": [],
"actions": []
}
.....
]
为什么它默认返回一个数组[]而不是一个对象,例如:
{
"count": 0,
"next": null,
"previous": null,
"results": []
}
答案 0 :(得分:1)
您需要覆盖序列化程序类的to_representation()方法。在这个官方文档链接中简要提到: http://www.django-rest-framework.org/api-guide/serializers/#overriding-serialization-and-deserialization-behavior
其他选项是覆盖您的类APIView的get和post方法或它的继承类
答案 1 :(得分:0)
您无法在列表中存储键/值对,['key': {}]
将无效,您应该逐个访问项目,就像在您的表示中一样。
由于many=True
而返回的数组,这意味着您将许多对象放在序列化程序中,并且它会等待您的序列。
答案 2 :(得分:0)
我看不到导致此输出的ORM查询,但是您的查询返回了多个符合您条件的项目。任何框架的默认行为(更不用说DRF)是将它们放在数组中,然后将其作为结果的“对象数组”返回。