2017-07-24 47 views
0

我的数据库中有三列(var1,va2和var3)。使用通配符在Django中执行queryset筛选器

在html页面上,用户可以输入var1,var2或var3的值或三个变量的组合(例如仅为var1和var3或var2和var3提供数据)。

我的查询搜索的是:

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

如果用户对所有三个变量进入价值,这是非常简单的。

如果用户输入两个或一个变量的值,我希望queryset过滤器只匹配用户输入值的列。例如:用户输入了var2和var3的数据。生成的搜索将是:

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

但是,有没有办法让所有的三个变量滤波代码等类似的东西:应用

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

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

回答

2

可能或类似以前的答案

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

准备的过滤器的字典,如果值提供否则返回所有的查询集:

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

为什么你先做qs然后过滤。为什么不直接通过字典过滤呢? –

+0

@HC你可以,我只是想更有说服力。查看更新的代码。谢谢! –

+0

谢谢。我认为可能会让代码运行得更快。谢谢! –

相关问题