2009-11-10 1 views
2

À partir du code ci-dessous:Quand Django effectue-t-il la recherche dans la base de données?

dvdList = Dvd.objects.filter(title = someDvdTitle)[:10] 

for dvd in dvdList: 
    result = "Title: "+dvd.title+" @ "+dvd.price+"." 

Quand Django fait la recherche? Peut-être que c'est juste de la paranoïa, mais il semble que si je commente la boucle for, cela revient beaucoup plus vite. La première ligne configure-t-elle un filtre, puis la boucle for l'exécute, ou suis-je complètement confus? Qu'est-ce qui se passe réellement avec ces lignes de code?

EDIT:

Que se passerait-il si je limité la objects.filter à « 1000 », puis mis en place un compteur dans la boucle qui a éclaté après de 10 itérations. Est-ce que cela n'obtiendrait effectivement que 10 valeurs ou 1000?

+0

@_bravado - Est-ce que ma réponse fournit suffisamment d'informations pour "Que se passe-t-il réellement avec ces lignes de code?" à présent? Vous avez modifié votre question après ma première publication. Je peux essayer et expliquer plus si cela aiderait. –

+0

Oui, c'était parfait. Cependant, je l'ai édité à nouveau avec une question supplémentaire. Je voulais juste être absolument certain de ce qui arriverait si je limitais le filtre à 1000, mais seulement itéré dans une boucle for 10 fois. – Federer

Répondre

3

Les querysets Django sont évalués paresseusement, donc oui, la requête ne sera pas réellement exécutée tant que vous n'essayez pas d'en extraire des valeurs (comme vous le faites dans la boucle for).

De la documentation:

Vous pouvez évaluer un QuerySet de la manière suivante:

Iteration. Un QuerySet est itérable, et il exécute sa requête de base de données le la première fois que vous le parcourez. Pour exemple, ceci affichera le titre de toutes les entrées de la base de données:

for e in Entry.objects.all(): 
    print e.headline 

... (snip) ...

Voir When Querysets are evaluated.

par votre édition:

Si vous limité le filtre à 1000, puis mis en place un compteur dans la boucle qui a éclaté après de 10 itérations, alors vous frappez la base de données pour tous les 1000 lignes - Django n'a aucun moyen de savoir à l'avance exactement ce que vous allez faire avec le Queryset - il sait juste que vous voulez en extraire des données, donc évalue la chaîne de requête qu'il a créée.

+0

Merci beaucoup, Dominic. Parfait! :) – Federer

+0

Pas de problème, content que ça a aidé! –

0

Il peut être également bon d'évaluer tout à la fois en utilisant list() ou toute autre méthode d'évaluation de la requête. Je trouve cela pour booster les performances parfois (pas de paiement pour les connexions DB à chaque fois).

Trouver plus d'informations sur quand django évalue here.

Questions connexes