Django-fr

Forum

#1 29-05-2015 19:06:15

Drife
Membre
Inscription : 15-03-2015
Messages : 8

Optimisaer la vitesse d'exécution des requêtes?

Bonjour à tous,

Je me pose une petite question pointue sur la façon dont Django évalue et exécute les requêtes.

Je cherche à ramener toutes les commandes d'un utilisateur, qui sont de 2 types: Archivés ou Active (sachant qu'il peut y avoir des commandes inactives et non archivée, donc l'un n'est pas complémentaire de l'autre).
On peut écrire ça:

    q_cmd_archives =  Commande.objects.filter(client=request.user.utilisateur, commande_archive=True)
    q_cmd_active    =  Commande.objects.filter(client=request.user.utilisateur, commande_activeTrue)

Mais moi j'ai plutôt écrit ça:

    q_cmd_utilisateur = Commande.objects.filter(client=request.user.utilisateur)
    q_cmd_archives = q_cmd_utilisateur.filter(commande_archive=True)
    q_cmd_active = q_cmd_utilisateur.filter(commande_active=True)

En fait j'essaye d'optimiser: je me dit que si je ramène d'abord toutes les commandes utilisateurs (ce qui fait 1 accès en base), j'applique ensuite un filter différent sur ce résultat pour obtenir mes 2 résultats finaux.
Ce qui éviterait d'autre accès en base, dans la mesure ou on travaille directement sur une query ?

ceci vs la première méthode qui exécute 2 requêtes en base, pour sûr.

Mon raisonnement est-il juste ou j'ai tord ?

D'avance merci :-).

Hors ligne

#2 30-05-2015 22:15:17

Xavier Ordoquy
Administrateur
Lieu : Puteaux, France
Inscription : 12-10-2011
Messages : 312
Site Web

Re : Optimisaer la vitesse d'exécution des requêtes?

Les querysets sont évalués en mode lazy. Dans les deux cas tu auras 2 requêtes au final.
Si tu veux n'en avoir qu'une seule, il faut faire un filter une clause ou sur les deux critères de filtres (ou tout récupérer) et ensuite faire le tri en python via une boucle.
La documentation Django explique les conditions qui font qu'un queryset est évalué, je t'engage à rechercher et lire cette partie.

Hors ligne

Pied de page des forums