我正在使用声明式SQLAlchemy,我有三个模型:Role
,Permission
和RolePermission
。在我的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驱动程序] [SQL Server]无法绑定多部分标识符“ROLES.NAME”。( 4104)(SQLExecDirectW); [42000] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]语句无法准备。(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] \ nWHERHER [ROLES_PERMISSIONS]。[ROLE_ID] =? ORDER BY [ROLES]。[NAME]'(19,)
问题是Role
未加入,因此无法按Role.name
排序。我尝试指定primaryjoin=id == RolePermission.id1
,但这似乎没有改变任何东西。如何在此关系上指定连接,以便我可以按其中一个连接表(即Role.name
)中的字段进行排序?
答案 0 :(得分:22)
我无法使这些解决方案中的任何一个有效,但我找到了一种更简单的方法。
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
答案 1 :(得分:6)
您想要的是订购RolePermission对象的角色属性。传递order_by在Role类中设置顺序。
试试这个:
from sqlalchemy.orm import backref
permissionLinks = relationship(RolePermission, backref=backref("role", order_by=name))
设置后向参考的订单
答案 2 :(得分:0)
问题出在permissionLinks
关系中。按Role.name
排序其项目对我来说毫无意义。