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

Gre*_*ade 3 django django-models

我的安装有很多模块,每个模块都有很多版本。

翼:

class Module(Models.Model):
    install = models.ForeignKey(Install)
Run Code Online (Sandbox Code Playgroud)

一次安装有许多模块。

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

我发现我可以使用一堆东​​西序列化器以这种方式序列化:

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

但这是从内而外的(多对一的观点——许多版本有一个模块,但我想知道每个模块有哪些版本)。我在顶层得到版本列表,每个版本都调用它的模块,所以每个模块被多次列出:

[
    {
        "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", 
                }
            }
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

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

我想说类似的话

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

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

zap*_*.10 5

您可以尝试使用 django rest 框架。

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

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

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

现在定义您的安装模型序列化程序:

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

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

编辑:

忘了说了,关联模型的字段名应该和外键字段中related_name的值一致。

例如在模块模型中:

class Module(Models.Model):
    install = models.ForeignKey(Install, related_name='modules')
Run Code Online (Sandbox Code Playgroud)

现在您必须使用“模块”作为序列化程序中字段的名称。