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:
"other side" dari sebuah hubungan
ForeignKey. Yaitu:from django.db import models class Reporter(models.Model): # ... pass class Article(models.Model): reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
Dalam contoh diatas, metode-metode dibawah akan tersedia pada pengelola
reporter.article_set.Kedua sisi dari hubungan
ManyToManyField:class Topping(models.Model): # ... pass class Pizza(models.Model): toppings = models.ManyToManyField(Topping)
Dalam contoh ini, metode-metode dibawah akan tersedia kedua pada
topping.pizza_setdan padapizza.toppings.
-
add(*objs, bulk=True)¶ Menambahkan obyek model ditentukan ke kumpulan obyek terkait.
Contoh:
>>> 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.Anda dapat menggunakan argumen
bulk=Falsedaripada memiliki pengelola terkait melakukan pembaharuan dengan memanggile.save().Using
add()with a many-to-many relationship, however, will not call anysave()methods, 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.
-
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.
Ini adalah setara pada (tetapi lebih sederhana dari):
>>> 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(*objs)¶ 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
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.
-
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=Trueand it also accepts thebulkkeyword argument.
-
set(objs, bulk=True, clear=False)¶ 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.Argumen
bulkdilewatkan padaadd().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().
Catatan
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.Also, if you are using an intermediate model for a many-to-many relationship, then the
add(),create(),remove(), andset()methods are disabled.If you use
prefetch_related(), theadd(),remove(),clear(), andset()methods clear the prefetched cache.Changed in Django 1.11:The clearing of the prefetched cache described above was added.
Penugasan Langsung¶
A related object set can be replaced in bulk with one operation by assigning a new iterable of objects to it:
>>> new_list = [obj1, obj2, obj3]
>>> e.related_set = new_list
If the foreign key relationship has null=True, then the related manager
will first disassociate any existing objects in the related set before adding
the contents of new_list. Otherwise the objects in new_list will be
added to the existing related object set.
Ditinggalkan sejak versi 1.10: Direct assignment is deprecated in favor of the
set() method:
>>> e.related_set.set([obj1, obj2, obj3])
Ini mencegah kebingungan tentang sebuah penugasan menghasilkan sebuah tersirat tersimpan.