【发布时间】:2016-12-30 03:58:33
【问题描述】:
我的内容模型与标签模型具有多对多的关系。当我保存一个 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'])
基本上,当一个 Content 对象被保存时,接收者被用来调用一个 post_save 方法,该方法又调用 tag_content 方法来添加 m2m 关系。但是,我收到此错误:
TypeError
unhashable type: 'list'
它专门引用了 .add() 函数。知道为什么我会收到此错误吗?任何帮助表示赞赏。另外,请注意我在数据库中有 ids = 1、2 和 3 的 Tag 对象。
编辑
好的,我把我的 tag_content 改成了这样的:
def tag_content(obj):
for tag in Tag.objects.all():
print tag
obj.tags.add(tag)
这是因为 add() 方法接受对象实例,而不是 id。但是,它仍然不起作用:/ 我没有收到任何错误,但关系根本没有建立。
这很奇怪,因为 print tag 命令可以工作并打印出标签。换句话说,正在调用该函数。请问有什么帮助吗?顺便说一句,我正在运行 Django 1.9.8。
【问题讨论】:
-
你运行的是什么版本的 Django?
-
回复:你的编辑,你在执行
obj.save()吗?你在以前的版本上做过 -
是的,我正在执行保存方法。
-
您如何检查关系是否已建立?您编辑的代码应该可以工作。
-
通过进入管理面板。是的,我意识到这应该可行,但由于某种原因,它根本不起作用:/
标签: django django-models many-to-many django-orm