Django:相互嵌套序列化器

Django: Nesting serializers in each other

我正在弄清楚序列化程序如何相互合并或嵌套。在这个例子中,我有一个列模型(由 Column class 组成)和属于列模型的数据(由 Data class 组成)。我的问题是我不知道如何从另一个序列化器 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"
    }
]

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

首先你需要修改你的模型。您可以在 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"
        }
    }
]