0

我想创建一个查询,它将表单中发布的数据作为搜索条件,并根据这些条件过滤模型。例子

<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。

4

2 回答 2

2

代码流可能如下所示:

kwargs = {}

if first_name != '':
    kwargs.update({'first_name': "Foo"})
if middle_name != '':
    kwargs.update({'middle_name': "Bar"})

etc...

MyModel.objects.filter(**kwargs)
于 2013-11-13T15:21:42.337 回答
0

我的解决方案如下,但请告诉我它是否正确。

model.objects.filter(
                     Q(first_name__icontains=fist_name) &
                     Q(middle_name__icontains=middle_name) &
                     Q(last_name__icontains=last_name)
                    )

因为如果发布数据是空字符串,它将匹配所有,但如果其他任何一个不是空字符串,它将按该条件过滤这些结果。所以

例如

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 这种方式会花费更多的数据库事务时间吗?

于 2013-11-14T07:30:35.470 回答