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:class Reporter(models.Model): ... class Article(models.Model): reporter = models.ForeignKey(Reporter)
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): ... class Pizza(models.Model): toppings = models.ManyToManyField(Topping)
In this example, the methods below will be available both on
topping.pizza_setand onpizza.toppings.
These related managers have some extra methods:
-
add(obj1[, obj2, ...])¶ 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.
-
create(**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 much 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.
-
remove(obj1[, obj2, ...])¶ 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.
In order to prevent database inconsistency, this method only exists on
ForeignKeyobjects wherenull=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.
-
clear()¶ 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=True.