Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

People also ask

How do you add a many-to-many relationship?

For those relationships, you simply connect the appropriate fields with a line. To create many-to-many relationships, you need to create a new table to connect the other two. This new table is called an intermediate table (or sometimes a linking or junction table).

How does Django handle many-to-many relationship?

Behind the scenes, Django creates an intermediary join table to represent the many-to-many relationship. By default, this table name is generated using the name of the many-to-many field and the name of the table for the model that contains it.


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.


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: Insert queryset results into ManytoManyfield


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)