Django Unhashable Type List 即使我传入一个对象?(多对多字段)

Posted

技术标签:

【中文标题】Django Unhashable Type List 即使我传入一个对象?(多对多字段)【英文标题】:Django Unhasable Type List even though im passing in an object ?(many to many field) 【发布时间】:2020-05-31 21:02:51 【问题描述】:

我正在尝试为我的 django 应用程序运行迁移脚本,但我不断收到TypeError: unhashable type: 'list',即使我显然传入了一个对象:

我明白了:

 error line 87, in buildCisc
    c.exclusions.add(exclus)
line 944, in add
    self._add_items(
line 1119, in _add_items
    target_ids = self._get_target_ids(target_field_name, objs)
line 1059, in _get_target_ids
    target_ids.add(target_id)
TypeError: unhashable type: 'list'

当我运行以下代码时

...

        for ex in exclusionList:
            if len(Course.objects.filter(ID=ex)) > 0:  # exclusion course already exsists
                exclus = Course.objects.filter(ID=ex)
                c.exclusions.add(exclus[0])
            else:  # exclusion course does not exsist yet so we must create it first
                exclus = Course(ID=ex)
                exclus.save()
                c.exclusions.add(exclus) #this is line 87 causing the error

c 是在先前代码中创建的 Course 对象,exclusions 是从 Course 到自身的多对多字段,“ex”只是一个字符串。 如果我尝试使用 exclus = Course.objects.create(ID=ex) 代替,也会给出相同的错误。错误似乎是说我传递给c.exclusions.add 的排除是一个列表,但它很明显是一个对象。我什至尝试将 exclus 切换到 exclus[0] 以查看它是否以某种方式认为它是一个列表,但这给了我error: Course Object not iterable 所以它说它是 Object 类型,所以我对错误消息感到非常困惑。有什么想法吗?

编辑:我相信已经解决了这个问题,exclus = Course(ID=ex) 就是问题所在,特别是ex。出于某种原因,在我的阶段性阅读中,它以某种方式设置为一个列表,而不是我认为的字符串

【问题讨论】:

【参考方案1】:

由于c 是一个Course 对象,它包含一个列表,这是不能散列的部分。尝试使用.append() 而不是.add()add() 方法适用于集合,并且需要对对象进行哈希处理,因为它需要比较项目的唯一性。

【讨论】:

不幸的是,使用它给了我一个新错误:AttributeError: 'ManyRelatedManager' object has no attribute 'append' 您能否发布您的课程模型以便我们了解它是如何定义的?

以上是关于Django Unhashable Type List 即使我传入一个对象?(多对多字段)的主要内容,如果未能解决你的问题,请参考以下文章

如何克服 TypeError: unhashable type: 'list'

如何克服 TypeError: unhashable type: 'list'

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

TypeError: unhashable type: 'numpy.ndarray'

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

list去重,TypeError: unhashable type: 'list'