我的数据库中有三列(var1,va2和var3)。
在html页面上,用户可以输入var1,var2或var3的值或三个变量的组合(例如,仅为var1和var3或var2和var3提供数据)。
我的查询搜索是:
Rule.objects.filter(var1=user_var1, var2=user_var2, var3=user_var3, )
如果用户输入所有三个变量的值,这非常简单。
如果用户输入两个或一个变量的值,我希望查询集过滤器仅匹配用户输入值的列。例如:用户输入了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, )
答案 0 :(得分:2)
如果提供的值另外返回所有查询集,则准备要应用的过滤器的dict:
filters = {}
if user_var1:
filters['var1'] = user_var1
if user_var2:
filters['var2'] = user_var2
qs = Rule.objects.filter(**filters)
答案 1 :(得分: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)