2011-12-01 4 views

Répondre

1

vous pouvez filtrer votre queryset avant d'appeler values

Entry.objects.filter(is_admin=True).values_list('id', flat=True).order_by('id') 
+0

J'ai un querset = [obj1, ob2, ob3 ...]. Comment puis-je filtrer sur cet ensemble de requêtes. Je ne veux pas faire un nouvel appel db. En fait, je passe un queryset à une fonction. Et ces queryset peuvent provenir de différents modèles. Mais ma fonction est générique. – user426795

+0

Le jeu de requête a-t-il été évalué auparavant? Si ce n'est pas le cas, vous n'avez pas encore atteint la base de données, alors allez-y et faites-le. De plus, vous pourriez être dans trop d'optimisation prématurée, c'est OK pour frapper la DB quand vous avez besoin d'un ensemble spécifique d'éléments. –

+0

Ok Merci pour les conseils. Mais j'ai une fonction qui prend queryset. Je passe un jeu de requête évalué. Evaluation basée sur les différents paramètres Mais donc la fonction prend différents queryset sur différents ocassion. Mais en réalité la fonction fait le filtre sur le jeu de queries basé sur le is_admin = True – user426795

1

L'objectif serait de concevoir votre application afin que le queryset n'est pas évalué qu'après le dernier filtre est appliqué par votre fonction.

par exemple

qs = Entry.objects.filter(...whatever...) 
qs = qs.exclude(...whatever...) 
qs = qs.filter(...something_else...) 
# qs is not evaluated yet 

def my_func(some_qs): 
    return some_qs.filter(is_admin=True) 

qs = my_func(qs) 
# qs is still not evaluated yet 

si vous avez pas d'autre choix que de filtrer un queryset déjà évalué, alors sachez que vous pouvez simplement le traiter comme tout autre itératives, par exemple utiliser la fonction intégrée dans le filtre comme sur une liste :

admins = filter(lambda x: x.is_admin, my_evaluated_qs) 
Questions connexes