【发布时间】:2011-06-24 23:24:13
【问题描述】:
基于 Django 文档,我应该能够一次传递多个对象以添加到多对多关系中,但我得到了一个
* TypeError: unhashable type: 'list'
当我尝试传递一个列表中的 django 查询集时。传递 Queryset 或 ValuesListQueryset 似乎也失败了。有没有比使用 for 循环更好的方法?
【问题讨论】:
标签: django list manytomanyfield
基于 Django 文档,我应该能够一次传递多个对象以添加到多对多关系中,但我得到了一个
* TypeError: unhashable type: 'list'
当我尝试传递一个列表中的 django 查询集时。传递 Queryset 或 ValuesListQueryset 似乎也失败了。有没有比使用 for 循环更好的方法?
【问题讨论】:
标签: django list manytomanyfield
使用:object.m2mfield.add(*items),如documentation 中所述:
add() 接受任意数量的参数,而不是它们的列表。
add(obj1, obj2, obj3, ...)
要将列表扩展为参数,请使用*
add(*[obj1, obj2, obj3])
Django 不会为每个项目调用obj.save(),而是使用bulk_create()。
【讨论】:
添加,如果你想从查询集中添加它们
例子
# Returns a queryset
permissions = Permission.objects.all()
# Add the results to the many to many field (notice the *)
group = MyGroup.objects.get(name='test')
group.permissions.add(*permissions)
【讨论】:
subject = Subject.objects.filter(connect_class=class_list)。我做了student_data.subject.add(*subject),它奏效了。
Django 1.9 增加了添加到多对多关系的其他方法。
set 是一个新的细节:
>>> new_list = [obj1, obj2, obj3]
>>> e.related_set.set(new_list)
【讨论】:
set 我想一直都在那里。只是它过去在旧 Django 中通过赋值 e.related_set = new_list 等效于 e.related_set.set(new_list)。他们刚刚意识到“显式胜于隐式”。