Je suis un peu confus sur la façon d'utiliser _set
Dans un QuerySet
dans Django. Par exemple, un objet Blog b
et l'objet Entry
liés par l'attribut entry_set
. Quelle est la signification de b.entry_set.all()
?
J'apprécierais que quelqu'un puisse utiliser cet exemple pour afficher la sortie possible.
Ce que vous voyez est une recherche inversée d'objets associés .
Dans votre exemple:
class Blog(models.Model):
pass
class Entry(..):
blog = Blog(..)
Maintenant, étant donné l'objet e
de type Entry
, vous feriez e.blog
pour accéder à l'objet connexe Blog
- qui est une relation directe. Le _set
est une variable de classe de recherche inversée Django met à votre place.
Donc, étant donné l'objet b
- vous feriez:
entries = b.entry_set.all()
La raison pour laquelle l'inverse est un ensemble de requêtes est, ForeignKey est 1-to-many
relation. Par conséquent, l'inverse est un ensemble de requêtes.
Le _set
l'objet est rendu disponible lorsque related_name
n'est pas spécifié .
En bref:
Supposons que vous ayez un modèle Car
et un modèle Wheel
. Wheel
a une relation de clé étrangère avec Car
comme suit:
class Car(models.Model):
pass
class Wheel(models.Model):
car = models.ForeignKey(Car, on_delete=models.CASCADE) # on_delete parameter is mandatory in Django 2.0
Disons que w
est une instance de Wheel
et c
est une instance de Car
:
>>> w.car # returns the related Car object to w
>>> c.wheel_set.all() # returns all Wheel objects related to c
Explication détaillée
En utilisant les modèles définis ci-dessus, un objet Wheel
w
peut obtenir son objet Car
associé en accédant à l'attribut car
: w.car
.
Si un modèle a un ForeignKey
, les instances de ce modèle auront accès à l'objet étranger associé via un simple attribut du modèle.
Selon l'officiel documentation Django :
Django crée également des accesseurs API pour "l'autre" côté de la relation - le lien entre le modèle associé et le modèle qui définit la relation.
Dans ce cas, un objet Car
c
a accès à une liste de tous les objets Wheel
associés via l'attribut wheel_set
: c.wheel_set.all()
.
Si un modèle a un ForeignKey
, les instances du modèle à clé étrangère auront accès à un Manager
qui renvoie toutes les instances du premier modèle. Par défaut, ce Manager
est nommé FOO_set
, Où FOO
est le nom du modèle source, en minuscules. Ce Manager
renvoie QuerySets
, qui peut être filtré et manipulé.