Как добавить несколько объектов в отношения ManyToMany одновременно в Django? - PullRequest
151 голосов
/ 10 февраля 2011

Исходя из документа Django, я должен быть в состоянии передать несколько объектов одновременно, чтобы добавить их во многие отношения, но я получаю

* Ошибка типа: неустранимый тип: 'список'

когда я пытаюсь передать набор запросов django, приведенный в списке. Передача Queryset или ValuesListQueryset, похоже, тоже не удалась. Есть ли лучший способ, чем использовать цикл for?

Ответы [ 3 ]

266 голосов
/ 10 февраля 2011

Использование: object.m2mfield.add(*items), как описано в документации :

add() принимает произвольное количество аргументов, а не их список.

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

Чтобы развернуть этот список в аргументы, используйте *

add(*[obj1, obj2, obj3])

Приложение:

Django не вызывает obj.save() для каждого элемента, но вместо этого использует bulk_create().

37 голосов
/ 28 августа 2015

Для добавления, если вы хотите добавить их из набора запросов

Пример

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

От: Вставка результатов набора запросов в ManytoManyfield

24 голосов
/ 03 июля 2016

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