我正在尝试在同一模型中的self
上创建创建M2M值。我可以更新name
字段。但是,当我更新M2M(supertag)字段时,我不断获得TypeError
。
class Tag(models.Model):
name = models.CharField("Name", max_length=5000, blank=True)
supertag = models.ManyToManyField('self', blank=True)
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)
,它给出了同样的错误
答案 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")