Unhashable 类型:尝试在 Django 中使用 post_save 动态添加 m2m 关系时出现“列表”错误

Posted

技术标签:

【中文标题】Unhashable 类型:尝试在 Django 中使用 post_save 动态添加 m2m 关系时出现“列表”错误【英文标题】:Unhashable type: 'list' error when trying to add m2m relationships dynamically using post_save in Django 【发布时间】: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()吗?你在以前的版本上做过 是的,我正在执行保存方法。 您如何检查关系是否已建立?您编辑的代码应该可以工作。 通过进入管理面板。是的,我意识到这应该可行,但由于某种原因,它根本不起作用:/ 【参考方案1】:

您无法将列表传递给add(),这就是您收到错误的原因。您要么需要一次添加一个项目,要么将列表扩展为一系列参数,例如:

obj.tags.add(*[1,2,3]) # The * expands the list into the function arguments

这仍然会导致错误,因为您无法将 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)

【讨论】:

【参考方案2】:

根据add docs,您需要将实际模型作为参数传递。

如果你真的想要一个模型列表,你需要解压它,但在这种情况下你也可以直接将 objs 作为参数传递。

【讨论】:

以上是关于Unhashable 类型:尝试在 Django 中使用 post_save 动态添加 m2m 关系时出现“列表”错误的主要内容,如果未能解决你的问题,请参考以下文章

Unhashable 类型:'dict' 同时使用 pandas 的函数?

为什么TypeError:unhashable类型:'list'即将出现?

2. python提示:TypeError: unhashable type: 'list'

这里的正确语法是啥?获取类型 TypeError: unhashable type: 'dict

TypeError: unhashable type: 'numpy.ndarray'

Python debug——TypeError unhashable type(list/set/dict)