2016-02-26 57 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

相關問題