我有喜欢的模特-

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')

09-25 15:54