【发布时间】:2010-12-12 01:55:08
【问题描述】:
我的搜索功能通过以下任一方式接收搜索词:
- first_name“托马斯”
- 姓氏“史密斯”
- first_name last_name "thomas smith"
我正在尝试构建一个查询集,该查询集将通过任何这些术语找到客户端“thomas”,但如果两个名称都将结果缩小为“thomas smith”而不是“thomas jones”或“george smith”提供。
我已经对如何使用过滤器、Q 对象、字符串拆分和 for 循环来完成此任务进行了大量研究,但到目前为止还没有运气。
MODEL:
class Client(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
VIEW:
def search(request):
query = request.GET.get('s', '').strip()
if query:
client_set = (
(Q(first_name__in=query) & Q(last_name__in=query)) |
Q(first_name__icontains=query) |
Q(last_name__icontains=query)
)
else:
client_list = []
return render_to_response("search.html", {
"client_list": client_list,
"query": query
},context_instance=RequestContext(request))
上面的代码在搜索“thom”时有效,但没有找到“thomas smith”。我怎样才能重写它以按照描述的方式运行?
【问题讨论】:
-
您使用
first_name__in而不是first_name__icontains有什么具体原因吗?因为我很确定__in不会按照您期望的方式工作;) -
我也用 __icontains 试过了。我对 __in 的理解是它应该在 SQL 级别转换为 LIKE。虽然我的 SQL 生锈了,但我希望这意味着它将获取搜索查询的任何部分并将其与字段值匹配,以便“thomas smith”将匹配名字中的“thomas”,然后匹配“smith”姓氏。如果它确实以这种方式工作,我认为我的查询会起作用。显然不是。 :-)
-
__contains运算符将转换为LIKE,__icontains将转换为ILIKE。__in通常用于主键查找,并将转换为id IN (...)
标签: django