2016-02-26 68 views
1

请求(我正在搜索的对象)由用户分配的角色(由所述请求表示)组成。请看下图:检查多个ORM关系的字段是否包含值

class Request(db.Model): 
    __tablename__ = 'requests' 
    id = Column(Integer, primary_key=True) 
    user = Column(Integer, ForeignKey("users.id"), nullable=False) 
    role = Column(Integer, ForeignKey("roles.id"), nullable=False) 
    ... 

而且我们的关系:

# Define relationship between a User and their Requests 
requests = relationship('Request', backref='requested_by', lazy='dynamic') 

# Define relationship between a Role and Requests for this Role 
requests = relationship('Request', backref='requested_role', lazy='dynamic') 

最后,我们的目标:

# Return any requests made by a user or a role matching the search query 
data = Request.query.filter(or_(Request.requested_by.name.contains(search_query), 
           Request.requested_by.username.contains(search_query), 
           Request.requested_role.name.contains(search_query))).all() 

运行上面的代码,结果如下:

AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Request.requested_by has an attribute 'name' 

这里的想法是能够根据用户的相关细节或与其相关联的角色查找请求对象。这可能吗?

回答

1

是的。你需要做一个连接:

Request.query.join(Request.requested_by) \ 
      .join(Request.requested_role) \ 
      .filter(or_(User.name.contains(search_query), 
         User.username.contains(search_query), 
         Role.name.contains(search_query))) 

注意,这会产生LIKE '%whatever%'查询,如果你有一个大表,是令人难以置信的低效率。

+0

有没有更好的方式来接近这些表的搜索,性能明智?感谢您的回答 – JTApps

+0

@JTApps取决于您的具体情况,但如果您不想改变查询方式,可以查看['pg_trgm'](http://www.postgresql.org/docs/电流/互动/ pgtrgm.html)。 [全文搜索](http://www.postgresql.org/docs/current/static/textsearch.html)是另一种方法,但它可能不适用于用户名。 – univerio

+0

这两种解决方案是否仅限于PostgreSQL? – JTApps