单搜索框Web2py,联合使用
Posted
技术标签:
【中文标题】单搜索框Web2py,联合使用【英文标题】:Single search box Web2py, union usage 【发布时间】:2017-01-04 17:47:28 【问题描述】:我正在尝试在我的网站上创建一个搜索框。
首先,我使用split()
将搜索输入拆分为多个字符串。
然后我循环使用split()
创建的多个字符串,每个字符串都创建一个查询。这些查询将存储在一个列表中。
在下一步中,我将尝试执行所有这些查询并将结果(行)存储在另一个列表中。
接下来我要做的是合并所有这些结果(行)。在这种情况下,最终结果将是包含在搜索框中使用的所有不同关键字的查询的输出。
这是我的代码:
def ajaxlivesearch():
str = request.vars.values()[0]
a=str.split()
items = []
q = []
r =[]
for partialstr in a:
q.append((db.profiel.sport.like('%'+partialstr+'%'))|(db.profiel.speelsterkte.like('%'+partialstr+'%'))|(db.profiel.plaats.like('%'+partialstr+'%')))
for query in q:
r.append(db(query).select(groupby=db.profiel.id))
for results in r:
for (i,row) in enumerate(results):
items.append(DIV(A(B(row.id_user.first_name) ,NBSP(1), B(row.id_user.last_name),BR(), I(row.sport),I(','), NBSP(1), I(row.speelsterkte),I(','), NBSP(1),I(row.plaats),HR(), _id="res%s"%i, _href=row.id_user, _onclick="copyToBox($('#res%s').html())"%i), _id="resultLiveSearch"))
return TAG[''](*items)
我的问题是:如何合并多个结果(行)?
【问题讨论】:
【参考方案1】:您可以通过以下方式获取union of two Rows
objects(删除重复项):
rows_union = rows1 | rows2
但是,在单个查询中获取所有记录会更有效。为简化起见,您还可以使用.contains
方法,而不是使用.like
并用%
s 包装每个术语。
fields = ['sport', 'speelsterkte', 'plaats']
query_terms = [db.profiel[f].contains(term) for f in fields for term in a]
query = reduce(lambda a, b: a | b, query_terms)
results = db(query).select()
另外,您没有使用任何聚合函数,因此不清楚为什么您指定了groupby
参数(并且在任何情况下,每条记录都有一个唯一的id
,因此分组没有效果)。也许您的意思是orderby=db.profiel.id
。
最后,request.vars.values()[0]
可能不是一个好主意,因为request.vars
是一个类似字典的对象,并且不保证感兴趣的特定值是.values()
中的第一项。相反,只需引用特定变量的名称(例如,request.vars.keyword
),这也更有效,因为您提取的是单个项目,而不是将所有值转换为列表。
【讨论】:
以上是关于单搜索框Web2py,联合使用的主要内容,如果未能解决你的问题,请参考以下文章
函数stripslashes去除转义 shopnc 搜索框过滤特殊字符 输入单斜杆会自动转义