【发布时间】:2017-12-11 15:01:12
【问题描述】:
我正在我的项目中实现搜索,我想要的是连接到 where 子句中的列以从表中获取结果。
这是我正在做的事情:
from django.db.models import Q
if 'search[value]' in request.POST and len(request.POST['search[value]']) >= 3:
search_value = request.POST['search[value]'].strip()
q.extend([
Q(id__icontains=request.POST['search[value]']) |
(Q(created_by__first_name=request.POST['search[value]']) & Q(created_for=None)) |
Q(created_for__first_name=request.POST['search[value]']) |
(Q(created_by__last_name=request.POST['search[value]']) & Q(created_for=None)) |
Q(created_for__last_name=request.POST['search[value]']) |
(Q(created_by__email__icontains=search_value) & Q(created_for=None)) |
Q(created_for__email__icontains=search_value) |
Q(ticket_category=request.POST['search[value]']) |
Q(status__icontains=request.POST['search[value]']) |
Q(issue_type__icontains=request.POST['search[value]']) |
Q(title__icontains=request.POST['search[value]']) |
Q(assigned_to__first_name__icontains=request.POST['search[value]']) |
])
现在我想添加另一个 OR 条件,例如:
CONCAT(' ', created_by__first_name, created_by__last_name) like '%'search_value'%'
但是当我将此条件添加到查询集时,它变为 AND
where = ["CONCAT_WS(' ', profiles_userprofile.first_name, profiles_userprofile.last_name) like '"+request.POST['search[value]']+"' "]
tickets = Ticket.objects.get_active(u, page_type).filter(*q).extra(where=where).exclude(*exq).order_by(*order_dash)[cur:cur_length]
如何将其转换为 OR 条件?
【问题讨论】:
-
您能否编辑您的问题以提供更多代码信息?变量“q”到底是什么,“Q”又是什么?
-
这可能是一个关于 Django ORM 系统可扩展性的好问题。一个好的答案有可能激发一个新的 Django 包或如何博客或补丁,如果更多的人认为更多列的功能通常在关系的左侧有用。 @ThiagoRossener:Q object 是在 Django ORM 中创建通用布尔表达式的工具。表达式中的字段也有 F 对象,Lookup 和 Transform 对象等,但必须在 imo 中添加一些聪明的东西才能解决原始问题。
-
有了
where子句,我们希望Bobby Tables 永远不会在您的网站上进行搜索。 -
@C14L 感谢漫画。哈桑,请注意没有
params=...参数的extra(where=...)。 (阅读security warning about it)。