2011-07-19 70 views
8

我使用的是聲明式SQLAlchemy,我有三種模式:RolePermissionRolePermission。在我Role模型中,我有以下幾點:SQLAlchemy - order_by關係連接表

​​

現在permissions申報工作正常,以及與角色相關聯的權限出來的排序,因爲我希望(通過名稱)。然而,permissionLinks失敗,出現以下錯誤:

sqlalchemy.exc.ProgrammingError: (ProgrammingError) ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]The multi-part identifier "ROLES.NAME" could not be bound. (4104) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. (8180)') u'SELECT [ROLES_PERMISSIONS].[ROLE_ID] AS [ROLES_PERMISSIONS_ROLE_ID], [ROLES_PERMISSIONS].[PERMISSION_ID] AS [ROLES_PERMISSIONS_PERMISSION_ID], [ROLES_PERMISSIONS].[IS_DENIED] AS [ROLES_PERMISSIONS_IS_DENIED] \nFROM [ROLES_PERMISSIONS] \nWHERE [ROLES_PERMISSIONS].[ROLE_ID] = ? ORDER BY [ROLES].[NAME]' (19,)

的問題是,Role沒有被加入,所以它不能排序Role.name。我試過指定primaryjoin=id == RolePermission.id1,但這似乎沒有改變任何東西。我如何在這個關係上指定一個連接,以便我可以按照一個連接表中的字段進行排序(即Role.name)?

回答

0

問題在於permissionLinks的關係。通過Role.name訂購它對我來說沒有任何意義。

+0

我要顯示所有與給定的許可相關的'RolePermission'行,我想他們顯示在Role.name'的'秩序。目前,我從數據庫獲得結果後對它們進行排序,但似乎我應該可以用SQLAlchemy來完成。我顯示'RolePermission'行,而不是'Permission'行(通過'permissions'),因爲'RolePermission'有'Permission'沒有的有關創建日期,創建者等的信息。 –

+0

但是在你的示例代碼中,你正嘗試對與給定的_role_關聯的'RolePermission'對象進行排序。 –

+0

沒錯。看起來這應該是可行的,因爲每個'RolePermission'都有一個'Role',所以爲什麼我不能通過'Role'上的屬性對'RolePermission'進行排序呢? –

6

你想要的是訂購RolePermission對象的角色屬性。通過order_by設置Role類中的順序。

試試這個:

from sqlalchemy.orm import backref 

permissionLinks = relationship(RolePermission, backref=backref("role", order_by=name)) 

爲後面參考

+0

這工作對我來說 –

14

我不能讓這些解決方案的工作,但是我發現了一個更簡單的方式設置的訂單。

from sqlalchemy.ext.declarative import declarative_base 

class User(Base): 
    # .... 
    addresses = relationship("Address", 
         order_by="desc(Address.email)", 
         primaryjoin="Address.user_id==User.id") 

這裏找到: http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/relationships.html

+2

哈哈!遇到這個問題,找到你的答案!你的工作是唯一的! – nathancahill