Quand est-ce Django Effectuer la base de données de recherche?
-
19-09-2019 - |
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?
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