2012-07-16 55 views
0

我有以下命令,预期是种工作:是否可以在输入多个单词时查看两列?

DBSession.query(Users).filter(or_(Users.first_name.contains(search_term),Users.last_name.contains(search_term))).all() 

我搜索第一和最后一个名字在我的用户表,所以我可以通过搜索或者bobsmith找到bob smith,但我没有得到任何结果当我搜索bob smith。这显然是因为bob在first_name列中,而不是bob smith,所以它失败了。但是有没有办法在sqlalchemy中进行这种搜索?

我知道最坏的我可以创建一个全名的列,但我想我会问,以防万一它是可能的。我也把这个标签为sql,以防万一它可能与原始的sql,然后我只是试图根据原始查询来配置sqlalchemy版本。

回答

0

实现这一目标最简单的方法是使用Hybrid Attributes扩展:

from sqlalchemy.ext.hybrid import hybrid_property 

class User(Base): 
    #... 
    first_name = Column(String, nullable=False) 
    last_name = Column(String, nullable=False) 

    @hybrid_property 
    def full_name(self): 
     return self.first_name + " " + self.last_name 

    @hybrid_property 
    def _full_name_last_first(self): 
     """ @note: used only for search [last, first]. """ 
     return self.last_name + ", " + self.first_name 

def test_search(search_term): 
    q = session.query(User) 
    q = q.filter(
      or_(
       User.first_name.contains(search_term), 
       User.last_name.contains(search_term), 
       User.full_name.contains(search_term), 
       User._full_name_last_first.contains(search_term), 
       ), 
      ) 
    q = q.order_by(User.id) 
    return q.all() 

r1 = test_search('John Williams') 
assert len(r1) == 1 

r1 = test_search('Williams, Jo') 
assert len(r1) == 1 
相关问题