Ajouter 'source/part-3-django-concepts/queryset.adoc'
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
parent
ff8b436fb9
commit
cd371ceb57
|
@ -0,0 +1,27 @@
|
||||||
|
### Querysets & managers
|
||||||
|
|
||||||
|
#### 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
|
||||||
|
nous trouvons un `IN (...)`.
|
||||||
|
Càd que Django va récupérer tous les objets demandés initialement par le queryset, pour ensuite prendre toutes les clés primaires,
|
||||||
|
pour finalement faire une deuxième requête et récupérer les relations externes.
|
||||||
|
|
||||||
|
Au final, si votre premier queryset est relativement grand (nous parlons de 1000 à 2000 éléments, en fonction du moteur de base de données),
|
||||||
|
la seconde requête va planter et vous obtiendrez une exception de type `django.db.utils.OperationalError: too many SQL variables`.
|
||||||
|
|
||||||
|
La solution consiste à passer par un itérateur:
|
||||||
|
|
||||||
|
1. Le queryset peut-être construit comme d'habitude
|
||||||
|
2. Nous implémentons un itérateur sur les résultats du queryset, pour nous conformer aux limites du moteur de base de données
|
||||||
|
|
||||||
|
[source,python]
|
||||||
|
----
|
||||||
|
informations = (
|
||||||
|
<MyObject>.objects.filter(<my_criteria>)
|
||||||
|
.select_related(<related_field>)
|
||||||
|
.prefetch_related(<related_field>)
|
||||||
|
.iterator(chunk_size=1000)
|
||||||
|
)
|
||||||
|
----
|
Loading…
Reference in New Issue