我有一个搜索栏,可以使用以下查询搜索用户:
db.session.query(User).filter(or_(User.name.contains(keyword), User.location.contains(keyword))).limit(16).all()
如您所见,它使用关键字(来自搜索查询形成的列表)进行搜索。如果我搜索“John Smith”,则搜索会找到名称中包含' John'然后是名称中包含' Smith'的同一个用户,因此它将返回用户两次。
要解决此问题,我尝试使用distinct()
,如下所示:
db.session.query(User).distinct().filter(or_(User.name.contains(keyword), User.location.contains(keyword))).limit(16).all()
但它没有用,所以我尝试使用distinct(User.id)
:
db.session.query(User).distinct(User.id).filter(or_(User.name.contains(keyword), User.location.contains(keyword))).limit(16).all()
虽然这也不起作用。 那么问题是什么?
修改
有一点我忘了提到代码看起来像这样:
query = 'John Smith'
for keyword in query.split():
db.session.query(User).distinct().filter(or_(User.name.contains(keyword), User.location.contains(keyword))).limit(16).all()
这就是它返回同一用户的2个原因。我使用for循环因为数据库还有其他字段,所以如果我搜索John Smith Mexico
,它会搜索每个单词。
答案 0 :(得分:0)
解决问题的一种方法是为您要搜索的所有关键字提供一个唯一查询。 (也就是说,而不是distinct
,它不知道您实际上是在循环中运行查询; distinct
将独立应用于每个查询,这就是为什么你得到2个结果)。
这样的事情会起作用:
In [17]:
from sqlalchemy import or_
query = 'John Smith'
keyword_c = [User.name.contains(keyword) for keyword in query] + [User.location.contains(keyword) for keyword in query]
q = session.query(User).filter(or_(*keyword_c))
for x in q.limit(16).all():
print x.name
John Smith
希望它有所帮助。