2012-08-09 18 views
5

मान लीजिए मैं निम्नलिखित SQLAlchemy वर्गों को परिभाषित किया है:मैं एक गतिशील SQLAlchemy रिश्ते के प्रकार (उदाहरण के लिए कई से एक) कैसे निर्धारित कर सकता हूं?

Base = declarative_base() 

class Person(Base): 
    __tablename__ = 'person' 
    id = Column(Integer, primary_key=True) 
    computers = relationship('Computer', backref=backref('owner', lazy='dynamic')) 

class Computer(Base): 
    __tablename__ = 'computer' 
    id = Column(Integer, primary_key=True) 
    ownerid = Column(Integer, ForeignKey('person.id')) 

आगे मान लीजिए कि मैं आलसी क्वेरी वस्तु इस तरह से एक्सेस किया है:

relation = getattr(Computer, 'owner') 

मैं कैसे निर्धारित कर सकते हैं relation का एक उदाहरण के लिए संदर्भित करता Person (यानी, इस उदाहरण में, कई से एक रिश्ते में), या relation उदाहरणों के संग्रह को संदर्भित करता है (जैसे एक से कई रिश्तों में)? दूसरे शब्दों में, मैं गतिशील SQLAlchemy रिलेशनशिप ऑब्जेक्ट के रिलेशनशिप प्रकार को कैसे निर्धारित कर सकता हूं?

model._sa_class_manager[relation].property.uselist 

फिर आप उपयोग कर सकते हैं:

+0

मुझे यकीन नहीं है कि मैं सही सवाल समझता हूं, लेकिन आपके उदाहरण में, आप यह क्यों नहीं देखते कि यह संग्रह है (उदा। एक सूची) या एक आइटम? यह स्क्लेक्लेमी से पूरी तरह से स्वतंत्र है और डेटाबेस से पूरी तरह से एसक्यूएलकेमी की ओआरएम सुविधा और सार का उपयोग करेगा। – javex

+0

आप अधिकतर सही हैं: मुझे लगता है कि सही समाधान यह जांचना है कि 'इंस्टेंसेंस (रिलेशनशिप, लिस्ट)' --- यदि सही है तो हम इसे सिर्फ एक सूची की तरह इस्तेमाल कर सकते हैं, लेकिन यदि झूठी है तो आपको 'relation.one') 'एक ठोस उदाहरण के संबंध में मैप करने के लिए। यदि आप नीचे एक उत्तर जोड़ते हैं, तो मैं आपको इनाम दे सकता हूं (अगर आप यहां बताए गए चेतावनी को शामिल कर सकते हैं, तो आप कर सकते हैं)। – argentpepper

उत्तर

2

हम विचाराधीन रूप model = Computer और relation = 'owner' लगता है, तो निम्न विशेषता True यदि और केवल यदि संबंध के रूप में एक उदाहरण के लिए विरोध उदाहरणों की एक सूची है है इस परीक्षण करने के लिए किया जाए या नहीं getattr(model, relation) के परिणाम पर one() विधि कॉल करने के:

if model._sa_class_manager[relation].property.uselist: 
    related_instances = getattr(model, relation) 
else: 
    related_instance = getattr(model, relation).one() 

मैं विश्वास नहीं कर रहा हूँ यह है कि यह सबसे अच्छा समाधान है।

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