How to add multiple objects to ManyToMany relationship at once in Django ?

DjangoListManytomanyfield

Django Problem Overview


Based on the Django doc, I should be able to pass multiple objects at once to be added to a manytomany relationship but I get a

> *** TypeError: unhashable type: 'list'

when I try to pass a django queryset casted in a list. Passing a Queryset or a ValuesListQueryset seems to fail also. Is there a better way than use a for loop ?

Django Solutions


Solution 1 - Django

Use: object.m2mfield.add(*items) as described in the documentation:

add() accepts an arbitrary number of arguments, not a list of them.

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

To expand that list into arguments, use *

add(*[obj1, obj2, obj3])
Addendum:

Django does not call obj.save() for each item but uses bulk_create(), instead.

Solution 2 - Django

To add on, If you want to add them from a queryset

Example

# 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: https://stackoverflow.com/questions/12009658/insert-queryset-results-into-manytomanyfield/32266309#32266309

Solution 3 - Django

Django 1.9 adds additional ways for adding to a many-to-many relationship.

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

set is a new nicety:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionphilgo20View Question on Stackoverflow
Solution 1 - DjangoYuji 'Tomita' TomitaView Answer on Stackoverflow
Solution 2 - DjangoDr ManhattanView Answer on Stackoverflow
Solution 3 - DjangoaeroView Answer on Stackoverflow