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

Mise en place d’une passe­relle API entre Geotrek et Cirkwi

21/05/2025

Cet article présente le déve­lop­pe­ment de la passe­relle bidi­rec­tion­nelle permet­tant l’échange de données entre Cirkwi et Geotrek, ainsi que la confi­gu­ra­tion néces­saire à sa mise en service sur une instance Geotrek.
Voir l'article
Image
Encart pacerelle Cirkwi Geotrek

Makina Corpus publie la librai­rie d’au­then­ti­fi­ca­tion OpenID Connect Django

08/04/2025

Nous publions en logi­ciel libre notre inté­gra­tion du proto­cole OpenID Connect (OIDC) avec Django : django-pyoidc.
Voir l'article
Image
Encart librairie Django-pyoidc

DbTools­Bundle : sortie de la version 2

18/03/2025

Décou­vrez les nouveau­tés de la version 2 du DbTools­Bundle, au programme : version Stan­da­lone, Docker et Lara­vel
Voir l'article
Image

Inscription à la newsletter

Nous vous avons convaincus