2015-09-14 22 views
2

我试图在django sqlite数据库中实现搜索。如何为django Q对象动态加入多个参数

我得到一个未知长度的参数列表,它应该都与'LIKE'匹配。这意味着我需要至少匹配其中一个参数的所有对象。

正如我从django文档中看到的,我可以通过使用Q对象来实现。

例子:

Students.objects.get(
    Q(name_contains='franz') | 
    Q(birthdate_date=date(2005, 5, 2) | 
    Q(param3_contains='lorem' 
) 

现在的问题是,我该怎么处理它加入所有从PARAMS创建将q对象作为参数传递给objects.get()。我在这找不到任何东西。

这里的另一个问题是处理几种不同的字段查找类型。

我欣赏任何建议,帮助或帮助您可以给的链接。谢谢。

+0

不清楚你“加入Q对象”的意思,如果你想和他们在一起,你可以使用['&'](https://docs.djangoproject.com/en/1.8/ REF /模型/查询集/#q-对象)。另外你的例子似乎有不正确的字段查找语法,它应该是像'name__contains'两个下划线。 –

+0

我的意思是我不知道我得到哪些参数。所以它可能是2,3或7个参数。我必须遍历它们,将它们放在Q对象中,然后将它们作为参数传递给我的get函数。但我不知道我如何将这些论点与|连接在一起。所以我明确地想要使用OR。 – Igle

回答

5

如果要动态地构建查询列表,你可以有这样的顺序:

request = Q(name_contains='franz') 

if condition1: 
    request |= Q(birthdate_date=date(2005, 5, 2)) 

if condition2: 
    request |= Q(param3_contains='lorem') 

然后:

Students.objects.get(request) 

如果你需要的东西更通用的,你可以有通过一个字典的功能,如:

conditions = {'name_contains': 'franz', 
       'birthdate_date': date(2005, 5, 2), 
       'param3_contains': 'lorem'} 

并建立这样的条件(未经测试):

request = None 
for key, value in conditions: 
    new_request = Q(**{key: value}) 

    if request: request |= new_request 
    else: request = new_request 
0

我在我的应用程序中有类似的要求。我必须寻找各种名称的搜索关键词:

Qterm = Q(firstname__icontains=searchterm) | \ 
     Q(lastname__icontains=searchterm) | \ 
     Q(resume__icontains=searchterm) | \ 
     Q(companyname__icontains=searchterm)) 

,或者,如果你想要一个字段匹配到数searchterms的:

Qterm = Q() 
for term in ["robot", "animatronic", "automaton"]: 
    Qterm |= Q(rolename_icontains=term) 

fieldname_icontains最终成为一个LIKE。还有更多的标准,这样的用户应该是“积极的”,这是一个布尔字段:

Qactive = Q(active=True) 

最后,我将所有这些问与答对象是这样的:

Qs = Qterm & Qactive & Qthis & Qthat 

。 ..我检索我这样的活跃用户:

userlst = Users.objects.filter(Qs) 

我希望这有助于!

+0

我认为他希望查询集获得动态数量的参数,而不仅仅是一个'searchterm'。 –

+0

是的,你可能是对的。我在我的回答中加了这个。 –