我不知道是否有一个快速的方法来做到这一点,但我想做的是根据六个参数进行搜索,其中5个来自Select Inputs,另一个来自Input text,当选择更多选项时,搜索需要更具体。
有办法做到这一点与查找?或者我需要为每一个参数组合做一个if
?如果我要把所有的If都写出来,什么方法更有效?因为如果我要用2^6
if
表述来涵盖所有的组合,那就有点慢了。考虑到参数没有特定的顺序,所以任何组合都是可能的。
我在想Q objects
,但我不知道它们是否为此工作,我只将它们用于OR语句,我知道它们也可以用于and
语句,但我不知道它们是否与使用comma
不同。可能是这样的:
result = Product.objects.filter(Q(field1=param1)&Q(field2=param2)&Q(field3=param3)&Q(field4=param4)&Q(field5=param5)&Q(field6=param6))
似乎你可能有访问一个表单的cleaned_data
,你正在寻找做一些像"高级搜索"。在这种情况下,考虑到所有表单字段都与搜索相关,您可以执行如下操作
result = Product.objects.filter(**form.cleaned_data)
由于您希望只包含指定的字段,因此可以添加过滤语句以确保只查看相关字段。不幸的是,这在很大程度上取决于表单的外观。如果表单的非空值都为真,则可以执行如下操作
result = Product.objects.filter(**{k: v for k, v in form.cleaned_data.items() if v})
另一方面,如果您只想在字段与填充表单时的字段不同的地方应用过滤器,那么
可能会很好地满足您的需求。 result = Product.objects.filter(**{k: v for k, v in form.cleaned_data.items() if form.changed_data})
不幸的是,如果您有一个名为turtle_safe
的复选框,您将需要记录某人是否指示他们想要对海龟安全的结果还是对海龟不安全的结果。我建议的两种后续方法都不会应用"对海龟不安全"的过滤器,而是会过滤"对海龟安全没有偏好"(假设changed_data
选项的默认值为False)。
如果这还不够,你可以通过禁用/启用javascript来避免发布用户没有故意选择的字段,直到用户将它们添加到他们的搜索中。
如果你结束了,你可能想要设置默认值为None
,并使用第二个检查(只要None
不是一个有效的选项!)。
您不必使用Q
和&
。每个过滤器操作都执行and
。因此,您将拥有与参数相同数量的if
操作。
q = Product.objects.all()
if param1 != None:
q = q.filter(field1=param1)
if param2 != None:
q = q.filter(field2=param2)
#and so on
它相当于你的代码,但有if
.