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 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_set
dan padapizza.toppings
.
-
add
(*objs, bulk=True, through_defaults=None)¶ 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.
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=False
daripada memiliki pengelola terkait melakukan pembaharuan dengan memanggile.save()
.Using
add()
with a many-to-many relationship, however, will not call anysave()
methods (thebulk
argument 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_changed
signal, which will triggerpre_add
andpost_add
actions.Menggunakan
ada()
pada hubungan yang sudah ada tidak akan menggandakan hubungan, tetapi itu akan masih memicu sinyal.add()
also accepts the field the relation points to as an argument. The above example can be rewritten asb.entry_set.add(234)
.Use the
through_defaults
argument to specify values for the new intermediate model instance(s), if needed.Changed in Django 2.2:The
through_defaults
argument was added.
-
create
(through_defaults=None, **kwargs)¶ Membuat sebuah obyek baru, menyimpan itu dan menaruh itu dalam kumpulan obyek terkait. Mengembalikan obyek yang baru dibuat:
>>> 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
blog
tocreate()
. Django figures out that the newEntry
object'sblog
field should be set tob
.Use the
through_defaults
argument to specify values for the new intermediate model instance, if needed.Changed in Django 2.2:The
through_defaults
argument was added.
-
remove
(*objs, bulk=True)¶ memindahkan pbyek-obyek model tertentu dari kumpulan obyek terkait:
>>> 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_changed
signal if you wish to execute custom code when a relationship is deleted.Similarly to
add()
,remove()
also accepts the field the relation points to as an argument. The above example can be rewritten asb.entry_set.remove(234)
.For
ForeignKey
objects, 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, removinge
fromb.entry_set()
is equivalent to doinge.blog = None
, and because theblog
ForeignKey
doesn't havenull=True
, this is invalid.For
ForeignKey
objects, this method accepts abulk
argument 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_save
andpost_save
signals and comes at the expense of performance.Untuk hubungan many-to-many, argumen kata kunci
bulk
tidak ada.
-
clear
(bulk=True)¶ Memindahkan semua obyek dari kumpulan obyek terkait:
>>> 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 onForeignKey
s wherenull=True
and it also accepts thebulk
keyword argument.Untuk hubungan many-to-many, argumen kata kunci
bulk
tidak ada.
-
set
(objs, bulk=True, clear=False, through_defaults=None)¶ Ganti kumpulan dari obyek terkait:
>>> new_list = [obj1, obj2, obj3] >>> e.related_set.set(new_list)
This method accepts a
clear
argument 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
, argumenbulk
dilewatkan keadd()
danremove()
.Untuk hubungan many-to-many, argumen kata kunci
bulk
tidak 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()
.Similarly to
add()
,set()
also accepts the field the relation points to as an argument. The above example can be rewritten ase.related_set.set([obj1.pk, obj2.pk, obj3.pk])
.Use the
through_defaults
argument to specify values for the new intermediate model instance(s), if needed.Changed in Django 2.2:The
through_defaults
argument was added.
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.Jika anda menggunakan
prefetch_related()
, metodeadd()
,remove()
,clear()
, danset()
memberishkan cache yang terambil.