2011-09-27 5 views
1

J'ai un modèle que j'ai besoin de filtrer en fonction des conditions différentes. Je veux éviter d'avoir à écrire des conditions imbriquées compliquées et à adapter un filtre de modèle à chaque situation.django question filtre filtre

Y at-il de toute façon à concaténer ou combiner les arguments filtre() dans une variable puis mettre cette variable comme un ensemble d'arguments de filtre comme ceci ?:

db_table.objects.filter(variable_of_arguments) 

étant égal à:

db_table.objects.filter(
    (Q(first_name__icontains=search) | 
    Q(last_name__icontains=search)), 
    foo = True) 

Répondre

1

Je ne suis pas sûr, mais peut-être vous pouvez le faire avec 2 paramètres:

param1 = Q(first_name__icontains=search) | Q(last_name__icontains=search)) 
param2 = {'foo', False} 

db_table.objects.filter(param1, **param2) 
1

vous pouvez construire un nombre variable d'arguments et de les transmettre dans la façon suivante:

q = Q(first_name__icontains=search) | Q(last_name__icontains=search) 
p = Q(first_in_line=True) | Q(last_in_line=True) 

args = [q, p] 

kwargs = { 
    'foo': True 
    'bar': False 
} 

db_table.objects.filter(*args, **kwargs) 
# Equivalent to: 
# 
# db_table.objects.filter(
# Q(first_name__icontains=search) | Q(last_name__icontains=search), 
# Q(first_in_line=True) | Q(last_in_line=True), 
# foo=True, 
# bar=False 
#) 

Maintenant, vous pouvez utiliser ce que la logique que vous voulez construire args et kwargs et l'appel à filter() sera toujours le même.