序列化为json嵌套一对多(与多对一相对)

时间:2014-03-29 07:08:18

标签: django django-models

我的安装包含许多模块,每个模块都有许多版本。

α-LA:

class Module(Models.Model):
    install = models.ForeignKey(Install)

One Install有很多模块。

我想将整个集合序列化为json结构。

我发现我可以使用wad of stuff serializer以这种方式序列化:

 serializers.serialize("json", Version.objects.all(), indent=4, 
                        relations={'module':{'relations':('install',)}})

但这是从内到外开始的(多对一视图 - 许多版本都有一个模块,但我想知道每个模块有哪些版本)。我在顶层获得了版本列表,每个版本都调用了它的模块,因此每个模块都列出了很多次:

[
    {
        "pk": 1, 
        "model": "cmh_server.version", 
        "fields": {
            "name": "v1", 
            "module": {
                "pk": 1, 
                "model": "cmh_server.module", 
                "fields": {
                    "install": {
                        "pk": 1, 
                        "model": "cmh_server.install", 
                        "fields": {
                            "name": "CMBN"
                        }
                    }, 
                    "name": "CMBN", 
                }
            }
        },
        "pk": 2, 
        "model": "cmh_server.version", 
        "fields": {
            "name": "v1.1", 
            "module": {
                "pk": 1, 
                "model": "cmh_server.module", 
                "fields": {
                    "install": {
                        "pk": 1, 
                        "model": "cmh_server.install", 
                        "fields": {
                            "name": "CMBN"
                        }
                    }, 
                    "name": "CMBN", 
                }
            }
        }
    }
]

查看同一模块如何列出两次。那是“不对”。

我想说点什么

serializers.serialize("json", Install.objects.all(), indent=4, 
                      relations={'module':{'relations':('version',)}})

但当然这不起作用,因为Install模型没有名为“module”的字段。

1 个答案:

答案 0 :(得分:3)

您可以尝试使用django rest framework。

为模块模型和版本模型定义模型序列化程序:

class VersionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Version

class ModuleSerializer(serializers.ModelSerializer):
    versions = VersionSerializer(many=True)
    class Meta:
        model = Module
        fields = ('id', ..... , 'versions')

现在定义您的Install model serialiser:

class InstallSerializer(serializers.ModelSerializer):
    modules = ModuleSerializer(many=True)
    class Meta:
        model = Install
        fields = ('id', ..... , 'modules')

这将序列化每个安装的所有模块的安装数据,以及安装中每个模块的所有版本。

编辑:

我忘了提到这一点,相关模型字段的名称应该与外键字段中的related_name值相同。

例如,在模块模型中:

class Module(Models.Model):
    install = models.ForeignKey(Install, related_name='modules')

现在你必须使用' modules'作为序列化程序中字段的名称。