242

基于 Django 文档,我应该能够一次传递多个对象以添加到多对多关系中,但我得到了一个

* TypeError:不可散列的类型:'list'

当我尝试传递一个列表中的 django 查询集时。传递 Queryset 或 ValuesListQueryset 似乎也失败了。有没有比使用 for 循环更好的方法?

4

3 回答 3

403

使用:object.m2mfield.add(*items)文档中所述:

add()接受任意数量的参数,而不是它们的列表。

add(obj1, obj2, obj3, ...)

要将列表扩展为参数,请使用*

add(*[obj1, obj2, obj3])

附录:

Django 不会obj.save()为每个项目调用,而是使用bulk_create(), 代替。

于 2011-02-10T16:10:15.470 回答
75

要添加,如果要从查询集中添加它们

例子

# 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)

From:将查询集结果插入ManytoManyfield

于 2015-08-28T08:45:14.403 回答
47

Django 1.9 增加了添加到多对多关系的其他方法。

文档:https ://docs.djangoproject.com/en/dev/ref/models/relations/#django.db.models.fields.related.RelatedManager.set

set是一个新的细节:

>>> new_list = [obj1, obj2, obj3]
>>> e.related_set.set(new_list)
于 2016-07-03T04:43:05.000 回答