Mise à jour de 'source/part-3-django-concepts/queryset.adoc'
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Fred 2021-08-18 15:22:46 +02:00
parent bc725d59dd
commit b17a169762
1 changed files with 29 additions and 3 deletions

View File

@ -11,7 +11,8 @@ L'ORM de Django (et donc, chacune des classes qui composent votre modèle) propo
d'autres filtres à des filtres existants.
Ces deux propriétés vont de paire; par défaut, chaque classe de votre modèle propose un attribut `objects`, qui correspond
à un manager (ou un gestionnaire, si vous préférez). Ce gestionnaire constitue l'interface par laquelle vous accéderez à la base de données. Mais pour cela, vous aurez aussi besoin d'appliquer certains requêtes ou filtres. Et pour cela, vous aurez besoin des `querysets`, qui consistent en des ... ensembles de requêtes :-).
à un manager (ou un gestionnaire, si vous préférez).
Ce gestionnaire constitue l'interface par laquelle vous accéderez à la base de données. Mais pour cela, vous aurez aussi besoin d'appliquer certains requêtes ou filtres. Et pour cela, vous aurez besoin des `querysets`, qui consistent en des ... ensembles de requêtes :-).
Si on veut connaître la requête SQL sous-jacente à l'exécution du queryset, il suffit d'appeler la fonction str() sur la propriété `query`:
@ -66,9 +67,34 @@ Ajouter les sujets suivants :
. Prefetch
. select_related
#### Jointures
==== Gestionnaire de models (managers) et opérations
Chaque définition de modèle utilise un `Manager`, afin d'accéder à la base de données et traiter nos demandes.
Indirectement, une instance de modèle ne *connait* **pas** la base de données: c'est son gestionnaire qui a cette tâche.
Il existe deux exceptions à cette règle: les méthodes `save()` et `update()`.
* Instanciation: MyClass()
* Récupération: MyClass.objects.get(pk=...)
* Sauvegarde : MyClass().save()
* Création: MyClass.objects.create(...)
* Liste des enregistrements: MyClass.objects.all()
Par défaut, le gestionnaire est accessible au travers de la propriété `objects`.
Cette propriété a une double utilité:
1. Elle est facile à surcharger - il nous suffit de définir une nouvelle classe héritant de ModelManager, puis de définir, au niveau de la classe, une nouvelle assignation à la propriété `objects`
2. Il est tout aussi facile de définir d'autres propriétés présentant des filtres bien spécifiques.
==== Requêtes
DANGER: Les requêtes sont sensibles à la casse, **même** si le moteur de base de données ne l'est pas.
C'est notamment le cas pour Microsoft SQL Server; faire une recherche directement via les outils de Microsoft ne retournera pas
obligatoirement les mêmes résultats que les managers, qui seront beaucoup plus tatillons sur la qualité des recherches par
rapport aux filtres paramétrés en entrée.
==== Jointures
Pour appliquer une jointure sur un modèle, nous pouvons passer par les méthodes `select_related` et `prefetch_related`.
Il faut cependant faire **très** attention au prefetch related, qui fonctionne en fait comme une grosse requête dans laquelle