[PYTHON] Django / Objets associés (ajouter, créer, supprimer, effacer, définir) Résumé

écrire

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

Modèle à préparer, données


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)

À propos de chaque méthode

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)

Résumé

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.

référence

Recommended Posts

Django / Objets associés (ajouter, créer, supprimer, effacer, définir) Résumé
Définir la méthode ajouter supprimer effacer
Résumé des paramètres liés aux fichiers statiques (statiques) de Django
Résumé de Django
Résumé de Django