17

我正在使用声明性 SQLAlchemy,我有三个模型: RolePermissionRolePermission. 在我的Role模型中,我有以下内容:

class Role(Base):
    name = Column(u'NAME', VARCHAR(50), nullable=False, unique=True)
    permissionLinks = relationship(RolePermission, backref="role", order_by=name)
    permissions = relationship(Permission, backref=backref("roles",
      order_by=name), secondary=RolePermission.__table__,
      order_by=Permission.name)

现在permissions声明工作正常,与角色关联的权限按我预期的方式排序(按名称)。但是,permissionLinks失败并出现以下错误:

sqlalchemy.exc.ProgrammingError: (ProgrammingError) ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]无法绑定多部分标识符“ROLES.NAME”。(4104) ( SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not beprepared. (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] = ? 按 [角色] 订购。[姓名]' (19,)

问题是它Role没有被加入,所以它不能按Role.name. 我尝试指定primaryjoin=id == RolePermission.id1,但这似乎并没有改变任何东西。如何指定此关系的联接,以便可以按其中一个联接表(即Role.name)中的字段进行排序?

4

3 回答 3

28

我无法使这些解决方案中的任何一个起作用,但是我找到了一种更简单的方法。

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

于 2012-11-14T10:40:26.710 回答
8

您想要的是订购 RolePermission 对象的角色属性。传递 order_by 设置 Role 类中的顺序。

尝试这个:

from sqlalchemy.orm import backref

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

设置反向引用的顺序

于 2011-10-28T18:24:32.290 回答
0

问题在于permissionLinks关系。按 by 订购商品Role.name对我来说毫无意义。

于 2011-07-21T09:44:50.663 回答