as_dict
मेरे सभी वर्गों पर एक विधि प्राप्त करने के लिए मैंने एक Mixin
वर्ग का उपयोग किया जो चींटियों के प्लाज्मा द्वारा वर्णित तकनीक का उपयोग करता है ।
class BaseMixin(object):
def as_dict(self):
result = {}
for prop in class_mapper(self.__class__).iterate_properties:
if isinstance(prop, ColumnProperty):
result[prop.key] = getattr(self, prop.key)
return result
और फिर इसे अपनी कक्षाओं में इस तरह उपयोग करें
class MyClass(BaseMixin, Base):
pass
इस तरह से आप निम्न का एक उदाहरण पर आह्वान कर सकते हैं MyClass
।
> myclass = MyClass()
> myclass.as_dict()
उम्मीद है की यह मदद करेगा।
मैंने इसे थोड़ा आगे बढ़ाया है, मुझे वास्तव में अपने उदाहरण प्रस्तुत करने की आवश्यकता है dict
जैसे कि एचएएल ऑब्जेक्ट का रूप इसके साथ संबंधित वस्तुओं के लिंक के साथ है। इसलिए मैंने इस छोटे से जादू को यहां जोड़ दिया है, जो ऊपर के समान वर्ग के सभी गुणों पर क्रॉल करेगा, इस अंतर के साथ कि मैं Relaionship
गुणों में गहराई से क्रॉल करूंगा और links
इन के लिए स्वचालित रूप से उत्पन्न करूंगा ।
कृपया ध्यान दें कि यह केवल रिश्तों के लिए काम करेगा एक ही प्राथमिक कुंजी है
from sqlalchemy.orm import class_mapper, ColumnProperty
from functools import reduce
def deepgetattr(obj, attr):
"""Recurses through an attribute chain to get the ultimate value."""
return reduce(getattr, attr.split('.'), obj)
class BaseMixin(object):
def as_dict(self):
IgnoreInstrumented = (
InstrumentedList, InstrumentedDict, InstrumentedSet
)
result = {}
for prop in class_mapper(self.__class__).iterate_properties:
if isinstance(getattr(self, prop.key), IgnoreInstrumented):
# All reverse relations are assigned to each related instances
# we don't need to link these, so we skip
continue
if isinstance(prop, ColumnProperty):
# Add simple property to the dictionary with its value
result[prop.key] = getattr(self, prop.key)
if isinstance(prop, RelationshipProperty):
# Construct links relaions
if 'links' not in result:
result['links'] = {}
# Get value using nested class keys
value = (
deepgetattr(
self, prop.key + "." + prop.mapper.primary_key[0].key
)
)
result['links'][prop.key] = {}
result['links'][prop.key]['href'] = (
"/{}/{}".format(prop.key, value)
)
return result
__table__.columns
आपको SQL फ़ील्ड नाम देगा, न कि विशेषता नाम जो आपने अपने ORM परिभाषाओं में उपयोग किया है (यदि दोनों भिन्न हैं)।