dar*_*rse 1 django many-to-many django-models django-orm
我的内容模型与标签模型具有多对多关系。保存Content对象时,我想动态添加关系。我按照以下方式进行操作。
def tag_content(obj):
obj.tags.add([1,2,3])
obj.is_tagged = True
obj.save()
return obj
class Tag(models.Model):
name = models.CharField(max_length=255)
class Content(models.Model):
title = models.CharField(max_length=255)
is_tagged = models.BooleanField(default=False)
tags = models.ManyToManyField(Tag, blank=True)
def save(self, *args, **kwargs):
super(Content, self).save(*args, **kwargs)
@receiver(post_save, sender = Content)
def update_m2m_relationships_on_save(sender, **kwargs):
if not kwargs['instance'].is_tagged:
tag_content(kwargs['instance'])
Run Code Online (Sandbox Code Playgroud)
基本上,当保存Content对象时,将使用接收方来调用post_save方法,该方法又调用tag_content方法来添加m2m关系。但是,我收到此错误:
TypeError
unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)
它专门引用.add()函数。知道为什么我会收到此错误吗?任何帮助表示赞赏。另外,请注意我在数据库中有ID为1、2和3的Tag对象。
编辑
好了,我将tag_content更改为以下内容:
def tag_content(obj):
for tag in Tag.objects.all():
print tag
obj.tags.add(tag)
Run Code Online (Sandbox Code Playgroud)
这是因为add()方法接受对象实例,而不接受ID。但是,它仍然不起作用:/我没有收到任何错误,但是关系没有建立。
这特别奇怪,因为print tag命令可以工作并打印出标签。换句话说,该函数正在被调用。有什么帮助吗?顺便说一句,我正在运行Django 1.9.8。
您无法将列表传递给add(),这就是为什么您会收到错误消息。您要么需要一次添加一项,要么将列表扩展为一系列参数,例如:
obj.tags.add(*[1,2,3]) # The * expands the list into the function arguments
Run Code Online (Sandbox Code Playgroud)
这仍然会导致错误,因为您无法将ID传递给add()-必须将Tag对象传递给它。所以这样的事情会工作:
# Get a list of Tag objects
tags_to_add = [Tag.objects.get(id=j) for j in [1, 2, 3]]
# Now pass this to the add() function:
obj.tags.add(*tags_to_add)
Run Code Online (Sandbox Code Playgroud)