Un gestionnaire de liaison (« related manager ») est un gestionnaire utilisé dans un contexte de champ lié un-à-plusieurs ou plusieurs-à-plusieurs. Cela se produit dans deux cas :
Le « côté opposé » d’une relation ForeignKey. C’est-à-dire :
from django.db import models
class Reporter(models.Model):
# ...
pass
class Article(models.Model):
reporter = models.ForeignKey(Reporter)
Dans l’exemple ci-dessus, les méthodes ci-dessous seront disponibles pour le gestionnaire reporter.article_set.
Les deux côtés d’une relation ManyToManyField:
class Topping(models.Model):
# ...
pass
class Pizza(models.Model):
toppings = models.ManyToManyField(Topping)
Dans cet exemple, les méthodes ci-dessous seront disponibles à la fois pour topping.pizza_set et pour pizza.toppings.
Ces gestionnaires de liaison possèdent quelques méthodes supplémentaires :
Ajoute les objets modèles indiqués à l’ensemble des objets liés.
Exemple :
>>> b = Blog.objects.get(id=1)
>>> e = Entry.objects.get(id=234)
>>> b.entry_set.add(e) # Associates Entry e with Blog b.
Dans l’exemple ci-dessus, on appelle e.save() pour effectuer la mise à jour. Cependant, l’emploi de add() avec une relation plusieurs-à-plusieurs n’appelle aucune méthode save() mais crée plutôt les relations en utilisant QuerySet.bulk_create(). Si vous avez besoin de faire exécuter une certaine logique personnalisée lors de la création d’une relation, faites-le dans une fonction à l’écoute du signal m2m_changed.
Crée un nouvel objet, l’enregistre et le place dans l’ensemble des objets liés. Renvoie l’objet nouvellement créé :
>>> 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.
C’est équivalent à (mais beaucoup plus simple) :
>>> 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)
Notez qu’il n’y a pas besoin de fournir le paramètre nommé du modèle qui définit la relation. Dans l’exemple ci-dessus, nous ne transmettons pas le paramètre blog à create(). Django réalise lui-même que le champ blog du nouvel objet Entry doit recevoir la valeur b.
Enlève les objets modèles indiqués de l’ensemble des objets liés :
>>> b = Blog.objects.get(id=1)
>>> e = Entry.objects.get(id=234)
>>> b.entry_set.remove(e) # Disassociates Entry e from Blog b.
Comme avec add(), on appelle e.save() dans l’exemple ci-dessus pour effectuer la mise à jour. Cependant, l’emploi de remove() avec une relation plusieurs-à-plusieurs supprime les relations avec QuerySet.delete(), ce qui signifie qu’aucune méthode save() n’est appelée. Si vous avez besoin de faire exécuter du code personnalisé lors de la suppression d’une relation, faites-le dans une fonction à l’écoute du signal m2m_changed.
Pour les objets ForeignKey, cette méthode existe seulement quand null=True. Si le champ lié ne peut pas recevoir la valeur None (NULL), alors un objet ne peut pas être enlevé d’une relation sans être ajouté à une autre. Dans l’exemple ci-dessus, enlever e de b.entry_set() est l’équivalent de la définition e.blog = None, et comme la clé ForeignKey blog n’a pas l’option null=True, ce n’est pas valide.
Enlève tous les objets de l’ensemble des objets liés :
>>> b = Blog.objects.get(id=1)
>>> b.entry_set.clear()
Notez que cela ne supprime pas les objets liés, il ne fait que les dissocier.
Tout comme remove(), clear() n’est disponible pour un champ ForeignKey que lorsque null=True.
Saisissez un mot clef ou un nom de module, classe ou fonction.
Jan 13, 2016