我有喜欢的模特-
class Sectors(models.Model):
sector_mc = models.TextField()
class Insector(models.Model):
foundation = models.ForeignKey(Sectors)
name = models.TextField()
value = models.FloatField(default=0)
我希望我的数据采用以下格式:
"name": "cluster",
"children": [
{"name": "Tester", "value": 3938},
{"name": "CommunityStructure", "value": 3812},
]
},
{
"name": "graph",
"children": [
{"name": "BetweennessCentrality", "value": 34},
{"name": "LinkDistance", "value": 5731},
]
}
因此,“群集”进入“扇区”的“ sector_mc”
并且群集具有子级“ Tester”和“ CommunityStructure”(这些在群集ector_mc的“ Insector”的“名称”和“值”中输入)
同样,“ graph”进入Sectors的“ sector_mc”,并且图具有子项“ BetweennessCentrality”和“ LinkDistance”(这些在图ector_mc的“ Insector”的“名称”和“ value”中输入)
等等。
如何将它们以相同的关系保存在数据库中,以及如何使用DRF以这种格式构造它。我尝试与此使用DRF的嵌套关系,但无处可去。
我需要d3朝阳图的数据采用这种格式。如果还有其他解决方法,我也很乐意了解它们。谢谢
最佳答案
您可以创建一个SectorSerializer
,其中将包含嵌套的序列化程序InsectorSerializer
。
由于您使用不同的键进行输出,因此我们可以使用source
从字段名称中获取相应的值。
输出中的name
键对应于sector_mc
,因此我们将sector_mc
用作其source
。
输出中的children
键包含特定Sectors
实例的所有相关实例。我们可以使用FOO_set
作为children
字段的源。另外,由于将有多个相关实例,因此我们将many=True
参数与它一起传递。
class InsectorSerializer(serializers.ModelSerializer):
class Meta:
model = Insector
fields = ('name', 'value')
class SectorSerializer(serializers.ModelSerializer):
name = serializers.CharField(source='sector_mc') # get value from 'sector_mc'
children = InsectorSerializer(many=True, source='insector_set') # get all related instances
class Meta:
model = Sectors
fields = ('name', 'children')