2011-07-19 11 views
8

Estoy usando SQLAlchemy declarativo y tengo tres modelos: Role, Permission y RolePermission. En mi modelo Role, tengo el siguiente:SQLAlchemy - order_by on relationship for join table

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) 

Ahora la declaración permissions funciona bien, y los permisos asociados con un papel sale como espero ordenada (por su nombre). Sin embargo, permissionLinks falla con el siguiente error:

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,)

El problema es que no está siendo unieron Role, por lo que no se puede ordenar por Role.name. Intenté especificar primaryjoin=id == RolePermission.id1, pero eso no pareció cambiar nada. ¿Cómo puedo especificar una unión en esta relación para poder ordenar por un campo en una de las tablas unidas (a saber, Role.name)?

Respuesta

0

El problema está en la relación permissionLinks. Ordenar sus artículos por Role.name no tiene sentido para mí.

+0

quiero mostrar todas las filas 'RolePermission' asociados con un permiso dado, y quiero que se muestran en orden de' Role.name'. Actualmente los clasifico después de obtener los resultados de la base de datos, pero parece que debería poder hacer eso con SQLAlchemy. Muestro las filas 'RolePermission' y no solo las filas' Permiso' (a través de 'permisos') porque' RolePermission' tiene información sobre la fecha de creación, creador, etc. que 'Permiso' no tiene. –

+0

Pero en el código de muestra está intentando ordenar los objetos 'RolePermission' asociados con _role_ dado. –

+0

Derecha. Parece que eso debería ser factible, porque cada 'RolePermission' tiene un' Role', así que ¿por qué no puedo ordenar 'RolePermission's por una propiedad en' Role'? –

6

Lo que desea es pedir el atributo de rol del objeto RolePermission. Pasar order_by establece el orden en la clase Rol.

Prueba esto:

from sqlalchemy.orm import backref 

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

establecer un orden para la referencia hacia atrás

+0

Esto funcionó para mí –

14

que no podía hacer ninguna de estas soluciones funciona, sin embargo me pareció una manera más fácil.

from sqlalchemy.ext.declarative import declarative_base 

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

encontrar aquí: http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/relationships.html

+2

¡Jaja! ¡Se metió en este problema y encontró su respuesta! ¡El tuyo es el único que funciona! – nathancahill