Makina Blog

Le blog Makina-corpus

Django : améliorer les performances de prefetch_related avec l'objet Prefetch


Découvrez comment optimiser les requêtes faites par prefetch_related afin d'améliorer les performances de votre application Django.

Utiliser prefetch_related permet d'améliorer grandement les performances de ses QuerySet Django. Malheureusement cette requête à la base de données n'est pas optimale pour récupérer les objets.

C'est pourquoi il existe un objet Prefetch (depuis Django 1.7) permettant de préciser la QuerySet à utiliser par le prefetch_related.

Imaginons que nous avons les modèles suivants :

class Garniture(models.Model):
    nom = models.CharField(max_length=30)
    description = models.TextField() 

class Pizza(models.Model):
    nom = models.CharField(max_length=50)
    garnitures = models.ManyToManyField(Garniture)

Ainsi nous pouvons facilement récupérer les pizzas et leur garniture avec la QuerySet suivante :

Pizza.objects.prefetch_related('garnitures').all()

Mais cela récupérera tous les attributs des garnitures. Il est inutile d'avoir le champ description si on ne l'utilise pas, étant un champ texte et potentiellement long à récupérer. Nous pourrions utiliser la méthode only pour ne sélectionner que le nom :

Garniture.objects.only('nom').all()

C'est ici que Prefetch entre en jeu, car il va nous permettre de préciser la QuerySet à utiliser :

Pizza.objects.prefetch_related(Prefetch('garnitures', queryset=Garniture.objects.only('nom').all())).all()

Et voilà, nous avons optimisé la requête effectué par prefetch_related !

Il est évidement possible d'utiliser toutes les méthodes accessible sur les QuerySet tel que defer, select_related, ou pourquoi pas un autre prefetch_related.

prefetch_related est déjà une méthode puissante permettant d'optimiser les accès à la base de données, et l'objet Prefetch nous permet d'aller encore plus loin de façon simple et intuitive.

Actualités en lien

Image
Django PostgreSQL
07/11/2023

Utiliser des fonctions PostgreSQL dans des contraintes Django

Cet article vous présente comment utiliser les fonctions et les check constraints PostgreSQL en tant que contrainte sur vos modèles Django.

Voir l'article
Image
Encart Django
06/11/2023

Comment migrer vers une version récente de Django ?

Que ce soit pour avoir les dernières fonctionnalités ou les correctifs de sécurité, rester sur une version récente de Django est important pour la pérennité de son projet.

Voir l'article
Image
Agrégateur Geotrek
08/06/2023

Le projet Agrégateur : fusionner des bases de données Geotrek

Le partage et la diffusion des données font partie des problématiques historiques au cœur du projet Geotrek.

Voir l'article

Inscription à la newsletter

Nous vous avons convaincus