web-dev-qa-db-fra.com

_set in Django for a queryset

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.

17
user7517947

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é .

26
karthikr

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 Wheelw 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 Carc 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é.

9
lmiguelvargasf