2011-07-19 13 views
8

Używam deklaratywnego SQLAlchemy i mam trzy modele: Role, Permission i RolePermission. W moim Role modelu, mam następujące:SQLAlchemy - order_by w związku dla tabeli łączenia

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) 

Teraz deklaracja permissions działa dobrze i uprawnienia związane z rolą wyjdzie sortowane jako Spodziewam (według nazwy). Jednak permissionLinks nie powiedzie się z powodu następującego błędu:

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

Problemem jest to, że Role nie jest połączone, więc nie można sortować według Role.name. Próbowałem określać primaryjoin=id == RolePermission.id1, ale to nie zmienia niczego. Jak mogę określić sprzężenie w tej relacji, aby można było sortować według pola w jednej z połączonych tabel (mianowicie Role.name)?

Odpowiedz

0

Problem dotyczy relacji permissionLinks. Zamawianie jej przedmiotów przez Role.name nie ma dla mnie sensu.

+0

chcę, aby wyświetlić wszystkie wiersze 'RolePermission' związanych z danym zezwoleniem, i chcę je wyświetlane w kolejności' Role.name'. Obecnie sortuję je po uzyskaniu wyników z DB, ale wydaje mi się, że powinienem móc to zrobić z SQLAlchemy. Wyświetlam wiersze 'RolePermission', a nie tylko' Permission' (za pomocą 'permissions'), ponieważ' RolePermission' ma informacje o dacie utworzenia, twórcy itp., Których 'Permission' nie posiada. –

+0

Ale w kodzie przykładowym próbujesz sortować obiekty "RolePermission" związane z podanym _role_. –

+0

Dobrze. Wygląda na to, że powinno być możliwe, ponieważ każda 'RolePermission' ma' Role', więc dlaczego nie mogę sortować 'RolePermission's przez właściwość' Role'? –

6

Należy zamówić atrybut roli obiektu RolePermission. Przekazanie order_by ustawia kolejność w klasie Role.

Spróbuj tego:

from sqlalchemy.orm import backref 

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

ustawienie zamówienie na tylnym odniesienia

+0

To zadziałało dla mnie –

14

nie mogłem zrobić żadnego z tych rozwiązań nie działa, jednak znalazłem łatwiejszy sposób.

from sqlalchemy.ext.declarative import declarative_base 

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

znaleźć tutaj: http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/relationships.html

+2

Haha! Wpadłem na ten problem i znalazłem odpowiedź! Twój jest jedyny, który działa! – nathancahill

Powiązane problemy