web-dev-qa-db-ja.com

DjangoでManyToMany関係に複数のオブジェクトを一度に追加する方法

Django文書に基づいて、複数のオブジェクトを一度に渡して多くの関係に追加できるようにする必要がありますが、

* TypeError:ハッシュできないタイプ: 'list'

リストにキャストされたDjangoクエリセットを渡そうとすると。 QuerysetまたはValuesListQuerysetを渡すことも失敗するようです。 forループを使用するよりも良い方法はありますか?

156
philgo20

使用: ドキュメント で説明されているobject.m2mfield.add(*items)

add()は、引数のリストではなく、任意の数の引数を受け入れます。

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

そのリストを引数に展開するには、*を使用します

add(*[obj1, obj2, obj3])

補遺:

Djangoは各アイテムに対してobj.save()を呼び出しませんが、代わりにbulk_create()を使用します。

274

追加するには、クエリセットから追加する場合

# Returns a queryset
permissions = Permission.objects.all()

# Turns it into a list
permissions = list(permissions)

# Add the results to the many to many field (notice the *)

group = MyGroup.objects.get(name='test')

group.permissions.add(*permissions)

From: クエリセットの結果をManytoManyfieldに挿入

37
Dr Manhattan

Django 1.9は、多対多の関係に追加するための追加の方法を追加します。

ドキュメント: https://docs.djangoproject.com/en/1.9/ref/models/relations/#Django.db.models.fields.related.RelatedManager.set

setは新しい新機能です:

>>> new_list = [obj1, obj2, obj3]
>>> e.related_set.set(new_list)
26
aero