我想创建一个查询,将从表单发布的数据作为搜索creteria,并根据这些creteria过滤模型。实施例
<form>
<first_name input>
<middle_name input>
<last_name input>
</form>
我想要的行为是与所有查询结束匹配的视图,但前提是它们具有值。也就是说,如果用户只完成第一个名称输入以仅使用名字进行搜索,如果给出了中间名,则使用两个creteria等进行搜索。我的想法是手动执行此操作,但听起来不太好。
if first_name != '' and middle_name='' and last_name='':
return filtering only with name
elif etc....
这不具有建设性或正确性。还有另一种方法可以在django中执行此操作吗?仅当它不是空字符串时才使用creteria。
答案 0 :(得分:2)
代码流可能如下所示:
kwargs = {}
if first_name != '':
kwargs.update({'first_name': "Foo"})
if middle_name != '':
kwargs.update({'middle_name': "Bar"})
etc...
MyModel.objects.filter(**kwargs)
答案 1 :(得分:0)
我的解决方案如下,但请告诉我它是否正确。
model.objects.filter(
Q(first_name__icontains=fist_name) &
Q(middle_name__icontains=middle_name) &
Q(last_name__icontains=last_name)
)
因为如果帖子数据是空字符串,它将匹配所有字符串,但如果其他任何字符串不是空字符串,它将按该字符串过滤那些结果。所以
e.g
first_name=''
last_name = 'Jones'
middle_name='Paul'
然后
first_name matches all
but it extracts only thouse who their middle name is Paul and last name Jones
ergo John Paul Jones
:P这种方式在数据库事务时间内花费更多吗?