J'ai recherché plusieurs fois comment utiliser l'ajout, la création, la suppression, l'effacement et la définition. Il est difficile de lire l'anglais à chaque fois, je vais donc le résumer en japonais. 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) Vous pouvez mettre à jour la clé externe de la table enfant dans la relation parent-enfant à l'aide de la méthode add.
Exemple d'utilisation
>>> 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
Vous pouvez passer un objet qui n'a pas encore été enregistré en tant qu'argument en utilisant bulk = False
.
Cependant, comme «bulk = False», des requêtes seront émises pour le nombre d'objets à ajouter.
>>> 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) En utilisant la méthode create, vous pouvez créer un nouvel enregistrement avec une petite quantité de description.
>>> r1.article_set.create()
>>> r1.article_set.all()
<QuerySet [<Article: Article object (1)>, <Article: Article object (2)>, <Article: Article object (3)>]>
Cela a des résultats similaires à:
>>> new_a = Article(reporter=r1)
>>> new_a.save()
>>> r1.article_set.all()
remove(*objs, bulk=True)
remove ()
met à jour ForeignKey à Null.
Il ne peut être utilisé que lorsque ForeignKey (null = True)
.
Si vous définissez «Clé étrangère (null = True)» dans le modèle préparé ci-dessus, vous pouvez l'utiliser comme suit.
>>> r1.article_set.remove(a1, a2)
bulk=False
Vous pouvez également mettre à jour les enregistrements un par un en passant bulk = False
comme avec add ().
>>> r1.article_set.remove(a1, a2, bulk=False)
>>> r1.article_set.all()
<QuerySet []>
Si bulk = True
, QuerySet.update () ʻest appelé, mais si
bulk = False,
save ()` est appelé plusieurs fois.
clear(bulk=True)
clear ()
met à jour ForeignKey pour tous les enfants à Null.
Comme clear ()
, il ne peut être utilisé que lorsque 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 []>
Comme pour remove (), save ()
est appelé plusieurs fois.
set(objs, bulk=True, clear=False, through_defaults=None) Lien GitHub de l'ensemble (OneToMany)
Dans set ()
, ʻadd () ,
remove () et
clear () sont en cours d'exécution. Si vous passez
bulk = True / False comme argument,
bulk` sera inclus dans l'argument de ces méthodes exécutées à l'intérieur.
clear=False
>>> r1.article_set.set([a1, a3], bulk=False)
Est le même que:
>>> 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)
Est le même que:
>>> r1.article_set.clear()
>>> r1.article_set.add(a1, a3)
J'ai relu le document sur les objets liés de Django. En particulier, ma compréhension des options présentées comme arguments était vague, alors j'espère que cela aidera quelqu'un de similaire.