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"
}
]
您必须添加一个包含 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 了解更多信息并了解如何支持对嵌套序列化程序字段的写入操作。
首先你需要修改你的模型。您可以在 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"
}
}
]
我正在弄清楚序列化程序如何相互合并或嵌套。在这个例子中,我有一个列模型(由 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"
}
]
您必须添加一个包含 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 了解更多信息并了解如何支持对嵌套序列化程序字段的写入操作。
首先你需要修改你的模型。您可以在 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"
}
}
]