2

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

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

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

模型.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"
    }
]
4

2 回答 2

3

您必须添加一个包含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了解更多信息,并了解如何支持对嵌套序列化器字段的写操作。

于 2015-11-27T12:42:23.683 回答
0

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

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

接下来为类似创建一个新的序列化程序Data

class DataSerializer(serializers.ModelSerializer):

    class Meta:
        model = Data

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

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"
        }
    }
]
于 2015-11-27T12:51:34.753 回答