2017-07-24 2 views
0

J'ai trois colonnes (var1, va2 et var3) dans ma base de données.Utilisation de caractères génériques pour faire un filtre de queryset dans Django

Sur la page html, un utilisateur peut entrer des valeurs pour var1, var2 ou var3 ou une combinaison des trois variables (par exemple fournir des données uniquement pour var1 et var3 ou var2 et var3).

Ma requête de recherche est:

Rule.objects.filter(var1=user_var1, var2=user_var2, var3=user_var3,) 

Si l'utilisateur entre des valeurs pour les trois variables, cela est assez simple.

Si l'utilisateur saisit des valeurs pour deux ou une des variables, je voudrais que le filtre de jeu de requête corresponde uniquement aux colonnes pour lesquelles les utilisateurs ont saisi des valeurs. Par exemple: les utilisateurs ont entré des données pour var2 et var3. La recherche résultant serait:

Rule.objects.filter(var2=user_var2, var3=user_var3,) 

Mais est-il un moyen de garder les trois variables dans le code du filtre et donc quelque chose comme:

if user_var1 = null, then user_var1=[wildcard or all] 

Rule.objects.filter(var1=user_var1, var2=user_var2, var3=user_var3,) 

Répondre

2

Peut être ou comme réponse précédente

filter_vars = ['vars1', 'vars2', 'vars3'] 
filter_dic = {} 
for item in filter_vars: 
    user_var = request.GET.get(item, '') 
    if user_var: 
     filter_dic[item] = user_var 
Rule.objects.filter(**filter_dic) 
2

Préparer un dict de filtres à appliquer si les valeurs fournies sinon retourner tous queryset:

filters = {} 
if user_var1: 
    filters['var1'] = user_var1 
if user_var2: 
    filters['var2'] = user_var2 
qs = Rule.objects.filter(**filters) 
+0

Pourquoi faites-vous d'abord un qs puis filtrez. Pourquoi ne pas le filtrer directement à travers la dict? –

+0

@HC vous pouvez, j'essayais juste d'être plus explicite. Voir le code mis à jour. Merci! –

+0

Merci. Je pensais que cela pourrait accélérer le code. Merci! –