2012-06-16 159 views
3

假設我在sqlalchemy中有3個表。以聲明方式定義的用戶,角色和UserRoles。一個人怎麼會做這樣的事情表明:sqlalchemy關係和關係查詢

user = Users.query.get(1) # get user with id = 1 
user_roles = user.roles.query.limit(10).all() 

目前,如果我想獲得用戶角色我要查詢任意3個表,​​並執行以獲得預期結果的聯接。直接撥打user.roles帶來了我無法過濾或限制的項目列表,因此它不是非常有用。加入事物並不是很有幫助,因爲我試圖使用其他請求創建休息界面,例如: localhost/users/1/roles所以只需通過該查詢我需要能夠做到Users.query.get(1).roles.limit(10) etc etc這真的應該能夠「聰明起來」我的休息界面,沒有太多臃腫的代碼,如果條件,而不必知道哪些表加入什麼。用戶模型已經具有作爲關係屬性的角色,所以爲什麼我不能像關於普通模型那樣簡單地查詢關係屬性?

回答

10

只需使用Dynamic Relationship Loaders。以下代碼與上述文件逐字代碼相同:

class User(Base): 
    __tablename__ = 'user' 

    posts = relationship(Post, lazy="dynamic") 

jack = session.query(User).get(id) 

# filter Jack's blog posts 
posts = jack.posts.filter(Post.headline=='this is a post') 

# apply array slices 
posts = jack.posts[5:20]