Acuan obyek terkait¶
- 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 Blog(models.Model): # ... pass class Entry(models.Model): blog = models.ForeignKey(Blog, on_delete=models.CASCADE, null=True)
In the above example, the methods below will be available on the manager
blog.entry_set.Both sides of a
ManyToManyFieldrelationclass 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, through_defaults=None)¶
- aadd(*objs, bulk=True, through_defaults=None)¶
Asynchronous version:
aaddMenambahkan obyek model ditentukan ke kumpulan obyek terkait.
Example:
>>> b = Blog.objects.get(id=1) >>> e = Entry.objects.get(id=234) >>> b.entry_set.add(e) # Associates Entry e with Blog b.
Dalam contoh diatas, dalam kasus hubungan
ForeignKey,QuerySet.update()digunakan untuk melakukan pembaharuan. Ini membutuhkan obyek-obyek untuk sudah disimpan.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 (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.Menggunakan
ada()pada hubungan yang sudah ada tidak akan menggandakan hubungan, tetapi itu akan masih memicu sinyal.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).
- create(through_defaults=None, **kwargs)¶
- acreate(through_defaults=None, **kwargs)¶
Asynchronous version:
acreateCreates 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.
- remove(*objs, bulk=True)¶
- aremove(*objs, bulk=True)¶
Asynchronous version:
aremoveRemoves 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.Untuk hubungan many-to-many, argumen kata kunci
bulktidak ada.
- clear(bulk=True)¶
- aclear(bulk=True)¶
Asynchronous version:
aclearRemoves all objects from the related object set:
>>> b = Blog.objects.get(id=1) >>> b.entry_set.clear()
Catat ini tidak menghapus obyek-obyek terkait -- itu hanya memisahkan mereka.
Just like
remove(),clear()is only available onForeignKeys wherenull=Trueand it also accepts thebulkkeyword argument.Untuk hubungan many-to-many, argumen kata kunci
bulktidak ada.
- set(objs, bulk=True, clear=False, through_defaults=None)¶
- aset(objs, bulk=True, clear=False, through_defaults=None)¶
Asynchronous version:
asetReplace 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.Untuk obyek
ForeignKey, argumenbulkdilewatkan keadd()danremove().Untuk hubungan many-to-many, argumen kata kunci
bulktidak ada.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).
Catatan
Note that
add(),aadd(),create(),acreate(),remove(),aremove(),clear(),aclear(),set(), andaset()all apply database changes immediately for all types of related fields. In other words, there is no need to callsave()/asave()on either end of the relationship.If you use
prefetch_related(), theadd(),aadd(),remove(),aremove(),clear(),aclear(),set(), andaset()methods clear the prefetched cache.