2011-07-19 51 views
8

Tôi đang sử dụng SQLAlchemy khai báo và tôi có ba mô hình: Role, PermissionRolePermission. Trong mô hình Role tôi, tôi có như sau:SQLAlchemy - order_by về mối quan hệ cho bảng tham gia

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) 

Bây giờ tờ khai permissions hoạt động tốt, và các điều khoản liên quan đến vai trò đi ra được sắp xếp như tôi mong đợi (theo tên). Tuy nhiên, permissionLinks không thành công với các lỗi sau:

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

Vấn đề là Role không được tham gia, vì vậy nó không thể sắp xếp theo Role.name. Tôi đã thử chỉ định primaryjoin=id == RolePermission.id1, nhưng điều đó dường như không thay đổi bất cứ điều gì. Làm thế nào tôi có thể chỉ định một tham gia vào mối quan hệ này sao cho tôi có thể sắp xếp theo một trường trong một trong các bảng được nối (cụ thể là, Role.name)?

Trả lời

0

Sự cố xảy ra ở mối quan hệ permissionLinks. Đặt hàng các mặt hàng của nó bằng cách Role.name không có ý nghĩa với tôi.

+0

Tôi muốn hiển thị tất cả các 'RolePermission' hàng gắn liền với một sự cho phép nào đó, và tôi muốn họ hiển thị theo thứ tự của 'Role.name'. Hiện nay tôi sắp xếp chúng sau khi nhận được kết quả từ DB, nhưng có vẻ như tôi sẽ có thể làm điều đó với SQLAlchemy. Tôi hiển thị các hàng 'RolePermission' và không chỉ các hàng' Permission' (thông qua 'quyền') vì' RolePermission' có thông tin về ngày tạo, tác giả, vv mà 'Permission' không có. –

+0

Nhưng trong mã mẫu của bạn, bạn đang cố gắng sắp xếp các đối tượng 'RolePermission' được liên kết với _role_ đã cho. –

+0

Phải. Có vẻ như điều đó có thể thực hiện được, bởi vì mỗi 'RolePermission' có một' Vai trò', vậy tại sao tôi không thể sắp xếp 'RolePermission' bởi một thuộc tính trên' Vai trò'? –

6

Điều bạn muốn là đặt thuộc tính vai trò của đối tượng RolePermission. Việc chuyển order_by đặt thứ tự trong lớp Vai trò.

Hãy thử điều này:

from sqlalchemy.orm import backref 

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

thiết lập một trật tự cho tài liệu tham khảo lại

+0

Điều này làm việc cho tôi –

14

tôi không thể thực hiện bất kỳ của các giải pháp làm việc, tuy nhiên tôi thấy một cách dễ dàng hơn.

from sqlalchemy.ext.declarative import declarative_base 

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

Tìm thấy ở đây: http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/relationships.html

+2

Haha! Ran vào vấn đề này và tìm thấy câu trả lời của bạn! Của bạn là người duy nhất hoạt động! – nathancahill

Các vấn đề liên quan