On this page
Related objects reference
- class RelatedManager
- 
    A “related manager” is a manager used in a one-to-many or many-to-many related context. This happens in two cases: - The “other side” of a - ForeignKeyrelation. That is:- from django.db import models class Reporter(models.Model): # ... pass class Article(models.Model): reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)- In the above example, the methods below will be available on the manager - reporter.article_set.
- Both sides of a - ManyToManyFieldrelation:- class Topping(models.Model): # ... pass class Pizza(models.Model): toppings = models.ManyToManyField(Topping)- In this example, the methods below will be available both on - topping.pizza_setand on- pizza.toppings.
 - add(*objs, bulk=True, through_defaults=None)
- 
      Adds the specified model objects to the related object set. Example: >>> b = Blog.objects.get(id=1) >>> e = Entry.objects.get(id=234) >>> b.entry_set.add(e) # Associates Entry e with Blog b.In the example above, in the case of a ForeignKeyrelationship,QuerySet.update()is used to perform the update. This requires the objects to already be saved.You can use the bulk=Falseargument to instead have the related manager perform the update by callinge.save().Using add()with a many-to-many relationship, however, will not call anysave()methods (thebulkargument doesn’t exist), but rather create the relationships usingQuerySet.bulk_create(). If you need to execute some custom logic when a relationship is created, listen to them2m_changedsignal, which will triggerpre_addandpost_addactions.Using add()on a relation that already exists won’t duplicate the relation, but it will still trigger signals.For many-to-many relationships add()accepts either model instances or field values, normally primary keys, as the*objsargument.Use the through_defaultsargument to specify values for the new intermediate model instance(s), if needed. You can use callables as values in thethrough_defaultsdictionary and they will be evaluated once before creating any intermediate instance(s).Changed in Django 3.1:through_defaultsvalues can now be callables.
 - create(through_defaults=None, **kwargs)
- 
      Creates a new object, saves it and puts it in the related object set. Returns the newly created object: >>> b = Blog.objects.get(id=1) >>> e = b.entry_set.create( ... headline='Hello', ... body_text='Hi', ... pub_date=datetime.date(2005, 1, 1) ... ) # No need to call e.save() at this point -- it's already been saved.This is equivalent to (but simpler than): >>> b = Blog.objects.get(id=1) >>> e = Entry( ... blog=b, ... headline='Hello', ... body_text='Hi', ... pub_date=datetime.date(2005, 1, 1) ... ) >>> e.save(force_insert=True)Note that there’s no need to specify the keyword argument of the model that defines the relationship. In the above example, we don’t pass the parameter blogtocreate(). Django figures out that the newEntryobject’sblogfield should be set tob.Use the through_defaultsargument to specify values for the new intermediate model instance, if needed. You can use callables as values in thethrough_defaultsdictionary.Changed in Django 3.1:through_defaultsvalues can now be callables.
 - remove(*objs, bulk=True)
- 
      Removes the specified model objects from the related object set: >>> b = Blog.objects.get(id=1) >>> e = Entry.objects.get(id=234) >>> b.entry_set.remove(e) # Disassociates Entry e from Blog b.Similar to add(),e.save()is called in the example above to perform the update. Usingremove()with a many-to-many relationship, however, will delete the relationships usingQuerySet.delete()which means no modelsave()methods are called; listen to them2m_changedsignal if you wish to execute custom code when a relationship is deleted.For many-to-many relationships remove()accepts either model instances or field values, normally primary keys, as the*objsargument.For ForeignKeyobjects, this method only exists ifnull=True. If the related field can’t be set toNone(NULL), then an object can’t be removed from a relation without being added to another. In the above example, removingefromb.entry_set()is equivalent to doinge.blog = None, and because theblogForeignKeydoesn’t havenull=True, this is invalid.For ForeignKeyobjects, this method accepts abulkargument to control how to perform the operation. IfTrue(the default),QuerySet.update()is used. Ifbulk=False, thesave()method of each individual model instance is called instead. This triggers thepre_saveandpost_savesignals and comes at the expense of performance.For many-to-many relationships, the bulkkeyword argument doesn’t exist.
 - clear(bulk=True)
- 
      Removes all objects from the related object set: >>> b = Blog.objects.get(id=1) >>> b.entry_set.clear()Note this doesn’t delete the related objects – it just disassociates them. Just like remove(),clear()is only available onForeignKeys wherenull=Trueand it also accepts thebulkkeyword argument.For many-to-many relationships, the bulkkeyword argument doesn’t exist.
 - set(objs, bulk=True, clear=False, through_defaults=None)
- 
      Replace the set of related objects: >>> new_list = [obj1, obj2, obj3] >>> e.related_set.set(new_list)This method accepts a clearargument to control how to perform the operation. IfFalse(the default), the elements missing from the new set are removed usingremove()and only the new ones are added. Ifclear=True, theclear()method is called instead and the whole set is added at once.For ForeignKeyobjects, thebulkargument is passed on toadd()andremove().For many-to-many relationships, the bulkkeyword argument doesn’t exist.Note that since set()is a compound operation, it is subject to race conditions. For instance, new objects may be added to the database in between the call toclear()and the call toadd().For many-to-many relationships set()accepts a list of either model instances or field values, normally primary keys, as theobjsargument.Use the through_defaultsargument to specify values for the new intermediate model instance(s), if needed. You can use callables as values in thethrough_defaultsdictionary and they will be evaluated once before creating any intermediate instance(s).Changed in Django 3.1:through_defaultsvalues can now be callables.
 Note Note that add(),create(),remove(),clear(), andset()all apply database changes immediately for all types of related fields. In other words, there is no need to callsave()on either end of the relationship.If you use prefetch_related(), theadd(),remove(),clear(), andset()methods clear the prefetched cache.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
 https://docs.djangoproject.com/en/3.1/ref/models/relations/