2011-07-19 17 views
8

मैं घोषणात्मक SQLAlchemy का उपयोग कर रहा हूं और मेरे पास तीन मॉडल हैं: Role, Permission, और RolePermission। मेरी Role मॉडल में, मैं निम्नलिखित है:SQLAlchemy - तालिका में शामिल होने के लिए रिश्ते पर order_by

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

समस्या यह है कि Role शामिल नहीं हुए किया जा रहा है, तो यह नहीं Role.name द्वारा सॉर्ट कर सकते हैं। मैंने primaryjoin=id == RolePermission.id1 निर्दिष्ट करने का प्रयास किया, लेकिन ऐसा कुछ भी नहीं दिख रहा था। मैं इस रिश्ते में शामिल होने को कैसे निर्दिष्ट कर सकता हूं जैसे कि मैं किसी भी तालिका में शामिल हो सकता हूं (अर्थात्, Role.name)?

उत्तर

0

समस्या permissionLinks संबंध में है। Role.name द्वारा इसकी वस्तुओं को ऑर्डर करने से मुझे कोई समझ नहीं आता है।

+0

मैं एक दिया अनुमति के साथ जुड़े सभी 'RolePermission' पंक्तियों को प्रदर्शित करना चाहते हैं और मैं उन्हें' Role.name' के क्रम में प्रदर्शित करना चाहते हैं। वर्तमान में मैं उन्हें डीबी से परिणाम प्राप्त करने के बाद क्रमबद्ध करता हूं, लेकिन ऐसा लगता है कि मुझे स्क्लेक्लेमी के साथ ऐसा करने में सक्षम होना चाहिए। मैं 'रोलप्रमिशन' पंक्तियां प्रदर्शित करता हूं न केवल 'अनुमति' पंक्तियां (अनुमतियों के माध्यम से) क्योंकि 'रोलप्रमिशन' में निर्माण तिथि, निर्माता, आदि के बारे में जानकारी है कि 'अनुमति' नहीं है। –

+0

लेकिन आपके नमूना कोड में आप दिए गए _role_ से जुड़े 'रोलप्रमिशन' ऑब्जेक्ट्स को सॉर्ट करने का प्रयास कर रहे हैं। –

+0

दाएं। ऐसा लगता है कि ऐसा करने योग्य होना चाहिए, क्योंकि प्रत्येक 'रोलप्रमिशन' की 'भूमिका' है, तो मैं 'रोल' पर किसी संपत्ति द्वारा 'रोलप्रमिशन' को क्यों नहीं बदल सकता? –

6

आप जो चाहते हैं वह रोलप्रमिशन ऑब्जेक्ट की भूमिका विशेषता को ऑर्डर करना है। पासिंग ऑर्डर_बी रोल क्लास में ऑर्डर सेट करता है।

इस प्रयास करें:

from sqlalchemy.orm import backref 

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

वापस संदर्भ

+0

यह मेरे लिए काम किया –

14

मैं इन समाधानों में से किसी भी काम नहीं कर सके, हालांकि मैं एक आसान रास्ता मिल गया के लिए एक आदेश की स्थापना।

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

+2

हाहा! इस समस्या में भागो और आपका जवाब मिला! आपका काम केवल एक ही है! – nathancahill

संबंधित मुद्दे

 संबंधित मुद्दे