如何为 Django Q 对象动态加入多个参数
How to join multiple params dynamically for django Q object
我正在尝试在 django sqlite 数据库中执行搜索。
我得到一个未知长度的参数列表,这些参数都应该与 '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()。我在这上面找不到任何内容。
这里的另一个问题是处理几种不同的字段查找类型。
感谢您提供的任何建议、帮助或帮助链接。谢谢。
如果你想动态构建查询列表,你可以有这样的序列:
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.items():
new_request = Q(**{key: value})
if request: request |= new_request
else: request = new_request
我的申请中有类似的要求。我必须在各种名称中搜索搜索词:
Qterm = Q(firstname__icontains=searchterm) | \
Q(lastname__icontains=searchterm) | \
Q(resume__icontains=searchterm) | \
Q(companyname__icontains=searchterm))
或者,如果您想将一个字段与多个搜索词匹配:
Qterm = Q()
for term in ["robot", "animatronic", "automaton"]:
Qterm |= Q(rolename_icontains=term)
fieldname_icontains
最终变成了LIKE
。还有更多的标准,比如用户应该是 'active',这是一个布尔字段:
Qactive = Q(active=True)
最后,我像这样组合所有这些 Q 对象:
Qs = Qterm & Qactive & Qthis & Qthat
...我这样检索我的活跃用户:
userlst = Users.objects.filter(Qs)
希望对您有所帮助!
我正在尝试在 django sqlite 数据库中执行搜索。
我得到一个未知长度的参数列表,这些参数都应该与 '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()。我在这上面找不到任何内容。
这里的另一个问题是处理几种不同的字段查找类型。
感谢您提供的任何建议、帮助或帮助链接。谢谢。
如果你想动态构建查询列表,你可以有这样的序列:
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.items():
new_request = Q(**{key: value})
if request: request |= new_request
else: request = new_request
我的申请中有类似的要求。我必须在各种名称中搜索搜索词:
Qterm = Q(firstname__icontains=searchterm) | \
Q(lastname__icontains=searchterm) | \
Q(resume__icontains=searchterm) | \
Q(companyname__icontains=searchterm))
或者,如果您想将一个字段与多个搜索词匹配:
Qterm = Q()
for term in ["robot", "animatronic", "automaton"]:
Qterm |= Q(rolename_icontains=term)
fieldname_icontains
最终变成了LIKE
。还有更多的标准,比如用户应该是 'active',这是一个布尔字段:
Qactive = Q(active=True)
最后,我像这样组合所有这些 Q 对象:
Qs = Qterm & Qactive & Qthis & Qthat
...我这样检索我的活跃用户:
userlst = Users.objects.filter(Qs)
希望对您有所帮助!