Django:相互嵌套序列化程序

Posted

技术标签:

【中文标题】Django:相互嵌套序列化程序【英文标题】:Django: Nesting serializers in each other 【发布时间】:2016-03-01 15:26:00 【问题描述】:

我正在研究如何将序列化程序合并或相互嵌套。在这个例子中,我有一个列模型(由Column 类组成)和属于列模型的数据(由Data class 组成)。我的问题是我不知道如何从另一个序列化程序类调用 ModelSerializer 并传递参数(结果始终为空)。

如果我的模型在这种情况下是正确的,您能否建议我,以及如何创建所需的 JSON,以便结果重用现有的序列化程序并避免重复任何数据?

注意:在最好的情况下,数据属性应该相互依赖,这样只有那些定义为列的数据才会被序列化。

models.py

class Column(models.Model):
    data = models.CharField(max_length=200)
    title = models.CharField(max_length=200)

    def __str__(self):
        return self.order

class Data(models.Model):
    doc = models.CharField(max_length=200)
    order = models.CharField(max_length=200)
    nothing = models.CharField(max_length=200)

    def __str__(self):
        return self.order

期望的输出:


    "columns": [
        
            "data": "doc",
            "title": "Doc."
        ,
        
            "data": "order",
            "title": "Order no."
        ,
        
            "data": "nothing",
            "title": "Nothing"
        
    ],
    "data": [
        
            "doc": "564251422",
            "nothing": 0.0,
            "order": "56421"
        ,
        
            "doc": "546546545",
            "nothing": 0.0,
            "order": "98745"
        
    ]

但是使用 ModelSerializer 的结果是这样的:

[
    
        "doc": "564251422",
        "order": "56421",
        "nothing": "0.0"
    ,
    
        "doc": "546546545",
        "order": "98745",
        "nothing": "0.0"
    
]

【问题讨论】:

【参考方案1】:

您必须添加一个包含columnsdata 属性的模型,因为它们当前未链接。

您的models.py 文件:

class Table(models.Model):
    pass

class Column(models.Model):
    data = models.CharField(max_length=200)
    title = models.CharField(max_length=200)
    table = models.ForeignKey(Table)

    def __str__(self):
        return self.order

class Line(models.Model):
    doc = models.CharField(max_length=200)
    order = models.CharField(max_length=200)
    nothing = models.CharField(max_length=200)
    table = models.ForeignKey(Table)

    def __str__(self):
        return self.order

您的serializer.py 文件:

# import your related models and serializers

class ColumnSerializer(serializers.ModelSerializer):

    class Meta:
        model = Column
        fields = [
            'data',
            'title'
        ]

class LineSerializer(serializers.ModelSerializer):

    class Meta:
        model = Line
        fields = [
            'doc',
            'order',
            'nothing'
        ]

class TableSerializer(serializers.ModelSerializer):
    columns = ColumnSerializer(many=True)
    lines = LineSerializer(many=True)

    class Meta:
        model = Table
        fields = [
            'columns',
            'lines'
        ]

现在使用TableSerializer 序列化程序来序列化和反序列化您的Table 对象。

关于您的模型,Line 而不是 Data 可能更合适。还有

阅读Django-Rest-Framework - NestedRelationships 了解更多信息并了解如何支持对嵌套序列化器字段的写操作。

【讨论】:

这完全解决了这个问题(表格格式为 JSON)。对于我不了解的部分,我打开了另一个问题。 我需要在应用程序中调用它,这就是我打开第二个问题的原因。当table 是模型的实例时,TableSerializer.serialize(table)TableSerializer(data=table) 不起作用。【参考方案2】:

首先您需要修改模型。您可以在Column 模型中创建data ForeignKey 字段,例如:

class Column(models.Model):
    data = models.ForeignKey("Data")
    title = models.CharField(max_length=200)

接下来为Data 创建一个新的序列化程序,例如:

class DataSerializer(serializers.ModelSerializer):

    class Meta:
        model = Data

现在您可以在ColumnSerializer 中使用DataSerializer 来获取每一列的数据,例如:

class ColumnSerializer(serializers.ModelSerializer):
    data = DataSerializer(read_only=True)

    class Meta:
        model = Column

这将给出如下输出:

[
    
        "title" : "Doc",
        "data" :
            "doc": "564251422",
            "nothing": 0.0,
            "order": "56421"
        
     ,
     
        "title" : "Order no.",
        "data" :
            "doc": "546546545",
            "nothing": 0.0,
            "order": "98745"
        
    
]

【讨论】:

如果Data 引用了Column 怎么办?

以上是关于Django:相互嵌套序列化程序的主要内容,如果未能解决你的问题,请参考以下文章

Django 可写嵌套序列化程序更新

在 Django Rest Framework 中正确更新嵌套序列化程序

如何在 Django Rest Framework 中过滤嵌套的序列化程序?

需要 Django Rest Framework 嵌套序列化程序 = False 错误

使用 Django Rest Framework 序列化程序发布到嵌套字段

Django Rest Framework 中嵌套序列化程序的唯一验证