gwift-book/source/part-3-django-concepts/queryset.adoc

1.2 KiB
Raw Blame History

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 dhabitude

  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

informations = (
  <MyObject>.objects.filter(<my_criteria>)
  .select_related(<related_field>)
  .prefetch_related(<related_field>)
  .iterator(chunk_size=1000)
)