【问题标题】:Django: Nesting serializers in each otherDjango:相互嵌套序列化程序
【发布时间】: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"
    }
]

【问题讨论】:

    标签: json django django-models django-rest-framework django-serializer


    【解决方案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 怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2020-12-06
    • 2016-02-09
    • 2018-11-12
    • 2020-08-31
    • 2018-07-06
    • 1970-01-01
    相关资源
    最近更新 更多