2009-08-02 10 views
0

Dans une vue Django que je fais quelque chose comme ça ..Optimisation de Django: obtenir des informations de modèle en masse ..?

lists = Stuff.objects.exclude(model2=None) 
for alist in lists:       
    if alist.model2.model3.id == target_id: 
      addSomeStuff 

La lenteur vient de passer de modèle (ligne de base de données) pour modéliser l'instruction if.
Cela prend en fait près d'une seconde à s'exécuter lorsque les listes ne contiennent que 486 éléments. Je crois que c'est lent car 486 * 2 + 1 db recherches sont en cours. Si je devais réécrire cela, alors il a saisi toute la table model2 et la table model3 à la fois, et ensuite filtrer juste là, ce serait 3 hits db, je crois que ça irait beaucoup plus vite. Cela détruirait toute la gentillesse de Django.

Est-il possible de convaincre django de faire une sorte de recherche de données en masse comme celle-ci?

Répondre

5

Do

Stuff.objects.exclude(model2=None).select_related('model2') 

et faire

if alist.model2.model3_id == target_id 

Ceux-ci devraient couper à seulement 1 requête SQL.

Questions connexes