覆盖嵌套序列化程序的create方法会引发TypeError:create()获得了关键字参数的多个值

时间:2019-07-29 08:26:26

标签: python django django-rest-framework django-serializer

我想将数据发送到我的API。我的数据结构是嵌套的。因此,我尝试按照文档和SO覆盖create方法。

发送数据时,出现以下错误:

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模型几乎相同。它也附加到图上。所以最后我想使用双嵌套序列化器发送数据。我想我会在一个单独的问题中提出这个问题,但是如果有人能指出我正确的方法,我也会感到非常高兴。谢谢

1 个答案:

答案 0 :(得分:1)

我认为问题是您正在显式发送graph=graph关键字参数,并且graph内还有另一个node_data关键字参数。我假设来自NodeSerializer。因此,您需要从graph字段中删除NodeSerializer以使其起作用或使graph字段为只读。像这样

class NodeSerializer(serializers.ModelSerializer):

    id = serializers.IntegerField(required=False)

    class Meta:
        model  = Node
        fields = ('id',
                  'name',
                  'graph',
                  )

       read_only_fields = ('graph',)