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】:您必须添加一个包含columns
和data
属性的模型,因为它们当前未链接。
您的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 Rest Framework 中正确更新嵌套序列化程序
如何在 Django Rest Framework 中过滤嵌套的序列化程序?
需要 Django Rest Framework 嵌套序列化程序 = False 错误