Makina Blog
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
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.
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.
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.