自己的M2M与django

时间:2017-05-15 04:49:25

标签: django

我正在尝试在同一模型中的self上创建创建M2M值。我可以更新name字段。但是,当我更新M2M(supertag)字段时,我不断获得TypeError

models.py

class Tag(models.Model):
    name = models.CharField("Name", max_length=5000, blank=True)
    supertag = models.ManyToManyField('self', blank=True)

serializers.py

        supe = tag.all()
        print(supe)
        # returns [<Tag: XYZ>, <Tag: 123>]
        for y in supe:
            # import pdb; pdb.set_trace()
            tag = Tag.objects.update(supertag__pk=y.pk)
        tag.save()

错误:

TypeError: 'supertag__pk' is an invalid keyword argument for this function

我还尝试了tag = Tag.objects.update(supertag=supe),它给出了同样的错误

1 个答案:

答案 0 :(得分:0)

supe是一个查询集,它没有pk属性。

此外,您对不同的变量使用相同的名称。标签已经分配。

supe = tag.all()

将标记分配给新对象会影响for循环的工作,该循环基于以前的标记变量。

tag = Tag.objects.get_or_create(supertag__pk=supe.pk)

你不能这样做。

修改

函数get_or_create实际上返回元组,一个对象和一个布尔标志。 boolean标志指定是否创建了对象。 所以,你实施的逻辑是错误的。正如我们所讨论的那样,

你可以这样做,

for x in supe:
    if x.taglevel == 1:
        for value in supe:
            x.tag.add(value)
            x.save()
    else:
        #your next logic
        print("No level 1")