Ich habe mehrmals untersucht, wie man Hinzufügen, Erstellen, Entfernen, Löschen und Festlegen verwendet. Es ist mühsam, jedes Mal Englisch zu lesen, deshalb werde ich es auf Japanisch zusammenfassen. Django Documentation / Related objects reference
from django.db import models
class Reporter(models.Model):
pass
class Article(models.Model):
title = models.CharField(max_length=255, null=True)
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
r1 = Reporter.objects.create(name='reporter1')
r2 = Reporter.objects.create(name='reporter2')
a1 = Article.objects.create(title='article1', reporter=r1)
a2 = Article.objects.create(title='article2', reporter=r1)
a3 = Article.objects.create(title='article3', reporter=r2)
add(*objs, bulk=True, through_defaluts=None) Sie können den externen Schlüssel der untergeordneten Tabelle in der Eltern-Kind-Beziehung mithilfe der Methode add aktualisieren.
Beispiel der Verwendung
>>> r1.article_set.all()
<QuerySet [<Article: Article object (1)>, <Article: Article object (2)>]>
>>> r2.article_set.all()
<QuerySet [<Article: Article object (3)>]>
>>> r2.article_set.add(a1,a2)
>>> r1.article_set.all()
<QuerySet []>
>>> r2.article_set.all()
<QuerySet [<Article: Article object (1)>, <Article: Article object (2)>, <Article: Article object (3)>]>
bulk=False
Sie können ein Objekt übergeben, das noch nicht als Argument gespeichert wurde, indem Sie "batch = False" verwenden. Als "Bulk = False" werden jedoch Abfragen nach der Anzahl der hinzuzufügenden Objekte ausgegeben.
>>> r1.article_set.all()
<QuerySet [<Article: Article object (1)>, <Article: Article object (2)>]>
>>> new_a1 = Article()
>>> new_a2 = Article()
>>> r1.article_set.add(new_a1, new_a2, bulk=False)
>>> r1.article_set.all()
<QuerySet [<Article: Article object (1)>, <Article: Article object (2)>, <Article: Article object (4)>, <Article: Article object (5)>]
INSERT INTO `article` (`reporter_id`) VALUES (1) # new_a1
INSERT INTO `article` (`reporter_id`) VALUES (1) # new_a2
create(through_defaluts=None, **kwargs) Mit der Methode create können Sie einen neuen Datensatz mit einer kleinen Menge an Beschreibung erstellen.
>>> r1.article_set.create()
>>> r1.article_set.all()
<QuerySet [<Article: Article object (1)>, <Article: Article object (2)>, <Article: Article object (3)>]>
Dies hat ähnliche Ergebnisse wie:
>>> new_a = Article(reporter=r1)
>>> new_a.save()
>>> r1.article_set.all()
remove(*objs, bulk=True)
remove ()
aktualisiert ForeignKey auf Null.
Es kann nur verwendet werden, wenn "ForeignKey (null = True)".
Wenn Sie im oben vorbereiteten Modell "Fremdschlüssel (null = True)" festlegen, können Sie ihn wie folgt verwenden.
>>> r1.article_set.remove(a1, a2)
bulk=False Sie können Datensätze auch einzeln aktualisieren, indem Sie "Bulk = False" wie bei "add ()" übergeben.
>>> r1.article_set.remove(a1, a2, bulk=False)
>>> r1.article_set.all()
<QuerySet []>
Wenn "Bulk = True", wird "QuerySet.update ()" aufgerufen, aber wenn "Bulk = False", wird "Save ()" mehrmals aufgerufen.
clear(bulk=True)
clear ()
aktualisiert ForeignKey für alle Kinder auf Null.
Wie clear ()
kann es nur verwendet werden, wenn ForeignKey (null = True)
.
>>> r1.article_set.clear()
>>> r1.article_set.all()
<QuerySet []>
bulk=False
>>> r1.article_set.clear(bulk=False)
>>> r1.article_set.all()
<QuerySet []>
Wie bei remove () wird save ()
mehrmals aufgerufen.
set(objs, bulk=True, clear=False, through_defaults=None) GitHub-Link von set (OneToMany)
In set ()
werden add ()
, remove ()
und clear ()
ausgeführt.
Wenn Sie "Bulk = True / False" als Argument übergeben, wird "Bulk" in das Argument dieser darin enthaltenen Methoden aufgenommen.
clear=False
>>> r1.article_set.set([a1, a3], bulk=False)
Ist das gleiche wie:
>>> r1.article_set.remove(a2, bulk=False)
>>> r1.article_set.add(a1, a3, bulk=False)
clear=True
>>> r1.article_set.set([a1, a3], clear=True)
Ist das gleiche wie:
>>> r1.article_set.clear()
>>> r1.article_set.add(a1, a3)
Ich habe das Dokument über Djangos verwandte Objekte wieder gelesen. Insbesondere war mein Verständnis der als Argumente übergebenen Optionen vage, daher hoffe ich, dass es jemandem hilft, der ähnlich ist.