2009-07-06 6 views

Répondre

11

La réponse générale est que Django prend la décision d'exécuter la requête lorsque vous demandez réellement des enregistrements. Le plus souvent, cela signifie itération sur le jeu de requête (for record in queryset:) ou en utilisant la fonction intégrée list() pour convertir le jeu de requête en liste.

Voir When QuerySets are evaluated pour plus de détails sur les documents officiels.

Elle accomplit cette mission en définissant une classe, appelée QuerySet dans django/db/models/query.py, où les méthodes spéciales comme __repr__, __getitem__ et __iter__ sont codés pour faire la bonne chose.

Si vous avez besoin de forcer le chargement désireux suffit d'exécuter la fonction liste Python intégrée sur le queryset, comme:

qs = SomeModel.objects.all() 
ql = list(qs) 

Cet appel à list() effectuera la requête DB et charger tous les objets en mémoire . Il devrait être assez rare que vous ayez besoin de faire cela, mais un cas est lorsque vous avez besoin d'utiliser les résultats de la requête à plus d'un endroit dans vos modèles. La conversion en liste et transmission de la liste dans le contexte de votre modèle n'effectuera la requête qu'une seule fois au lieu d'une fois pour chaque endroit de votre modèle que vous itérez.

Questions connexes