Overwriting nested serializer's create method throws TypeError: create() got multiple values for keyword argument
Overwriting nested serializer's create method throws TypeError: create() got multiple values for keyword argument
我想向我的 API 发送数据。我的数据结构是嵌套的。所以我试图按照文档和 SO 覆盖创建方法。
发送数据时出现以下错误:
TypeError: create() got multiple values for keyword argument 'graph'
我的数据结构是这样的:
{
"project": "project1",
"name": "Graph1",
"description": "Graph belongs to Projekt1",
"nodes": [
{
"id": 2,
"name": "Node1 of Graph 1",
"graph": 3
}
]
}
她是我在我的序列化程序中尝试的(我认为这是非常标准的):
class GraphSerializer(serializers.ModelSerializer):
nodes = NodeSerializer(many=True)
class Meta:
model = Graph
fields = ('project',
'name',
'description',
'nodes',
)
def create(self, validated_data):
nodes_data = validated_data.pop('nodes')
graph = Graph.objects.create(**validated_data)
print(graph)
for node_data in nodes_data:
Node.objects.create(graph=graph,**node_data)
return graph
错误在 for 循环中。当我调试并打印 graph
时,它只返回一个图 (Graph1)。所以我不明白为什么我会得到一个多值错误。
如果需要,这里有更多信息:
Node serializer
class NodeSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(required=False)
class Meta:
model = Node
fields = ('id',
'name',
'graph',
)
My models
class Graph(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE)
name = models.CharField(max_length=120, blank=True)
description = models.CharField(max_length=400, blank=True)
def __str__(self):
return self.name
@property
def nodes(self):
return self.node_set.all()
class Node(models.Model):
name = models.CharField(max_length=120, blank=True)
graph = models.ForeignKey(Graph, on_delete=models.CASCADE)
def __str__(self):
return self.name
如有任何帮助,我们将不胜感激。提前致谢!
PS: 我还有一个和Node模型差不多的模型。它还附加到图形。所以最后我想用双嵌套序列化程序发送数据。我想我会在一个单独的问题中问这个问题,但如果有人能指出正确的方向,我也会很高兴。谢谢
我认为问题在于您显式发送了 graph=graph
关键字参数,而 node_data
中还有另一个 graph
关键字参数。我假设来自 NodeSerializer
。因此,您需要从 NodeSerializer
字段中删除 graph
以使其工作或将 graph
字段设为只读。像这样
class NodeSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(required=False)
class Meta:
model = Node
fields = ('id',
'name',
'graph',
)
read_only_fields = ('graph',)
我想向我的 API 发送数据。我的数据结构是嵌套的。所以我试图按照文档和 SO 覆盖创建方法。
发送数据时出现以下错误:
TypeError: create() got multiple values for keyword argument 'graph'
我的数据结构是这样的:
{
"project": "project1",
"name": "Graph1",
"description": "Graph belongs to Projekt1",
"nodes": [
{
"id": 2,
"name": "Node1 of Graph 1",
"graph": 3
}
]
}
她是我在我的序列化程序中尝试的(我认为这是非常标准的):
class GraphSerializer(serializers.ModelSerializer):
nodes = NodeSerializer(many=True)
class Meta:
model = Graph
fields = ('project',
'name',
'description',
'nodes',
)
def create(self, validated_data):
nodes_data = validated_data.pop('nodes')
graph = Graph.objects.create(**validated_data)
print(graph)
for node_data in nodes_data:
Node.objects.create(graph=graph,**node_data)
return graph
错误在 for 循环中。当我调试并打印 graph
时,它只返回一个图 (Graph1)。所以我不明白为什么我会得到一个多值错误。
如果需要,这里有更多信息:
Node serializer
class NodeSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(required=False)
class Meta:
model = Node
fields = ('id',
'name',
'graph',
)
My models
class Graph(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE)
name = models.CharField(max_length=120, blank=True)
description = models.CharField(max_length=400, blank=True)
def __str__(self):
return self.name
@property
def nodes(self):
return self.node_set.all()
class Node(models.Model):
name = models.CharField(max_length=120, blank=True)
graph = models.ForeignKey(Graph, on_delete=models.CASCADE)
def __str__(self):
return self.name
如有任何帮助,我们将不胜感激。提前致谢!
PS: 我还有一个和Node模型差不多的模型。它还附加到图形。所以最后我想用双嵌套序列化程序发送数据。我想我会在一个单独的问题中问这个问题,但如果有人能指出正确的方向,我也会很高兴。谢谢
我认为问题在于您显式发送了 graph=graph
关键字参数,而 node_data
中还有另一个 graph
关键字参数。我假设来自 NodeSerializer
。因此,您需要从 NodeSerializer
字段中删除 graph
以使其工作或将 graph
字段设为只读。像这样
class NodeSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(required=False)
class Meta:
model = Node
fields = ('id',
'name',
'graph',
)
read_only_fields = ('graph',)