Question

Dans le code suivant:

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

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

Quand Django fait la recherche? Peut-être juste la paranoïa, mais il semble si je commente la boucle, il retourne beaucoup plus rapide. Est la première ligne met en place un filtre, puis la boucle exécute, ou suis-je complètement embrouillé? 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. Ne serait-ce efficace seulement obtenir 10 valeurs ou 1000?

Était-ce utile?

La solution

Django QuerySets sont évalués paresseusement, alors oui, la requête ne sera pas réellement exécutée jusqu'à ce que vous essayer d'obtenir des valeurs de (comme vous faites dans la boucle de for).

A partir de la documentation:

  

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

     

Iteration . Un QuerySet est itérable, et   il exécute sa base de données requête du   première fois que vous itérer dessus. Pour   par exemple, cela 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 Lorsque QuerySets sont évalués .

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 des données sur, donc évalue la chaîne de requête, il est construit

Autres conseils

Il peut être bon aussi d'évaluer à la fois en utilisant list() ou toute autre méthode de eval de la requête. Je trouve pour améliorer les performances parfois (pas de payer pour les connexions DB à chaque fois).

Plus d'informations sur le moment django .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top