Um eine as_dict
Methode für alle meine Klassen zu erhalten, habe ich eine Mixin
Klasse verwendet, die die von Ants Aasma beschriebenen Techniken verwendet .
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
Und dann benutze es so in deinen Klassen
class MyClass(BaseMixin, Base):
pass
Auf diese Weise können Sie für eine Instanz von Folgendes aufrufen MyClass
.
> myclass = MyClass()
> myclass.as_dict()
Hoffe das hilft.
Ich habe ein bisschen weiter damit herumgespielt, ich musste meine Instanzen tatsächlich dict
als die Form eines HAL-Objekts mit seinen Links zu verwandten Objekten rendern . Also habe ich hier unten diese kleine Magie hinzugefügt, die über alle Eigenschaften der Klasse wie oben kriecht, mit dem Unterschied, dass ich tiefer in Relaionship
Eigenschaften krieche und links
diese automatisch generiere .
Bitte beachten Sie, dass dies nur für Beziehungen mit einem einzigen Primärschlüssel funktioniert
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
dass Sie die SQL-Feldnamen erhalten, nicht die Attributnamen, die Sie in Ihren ORM-Definitionen verwendet haben (falls sich die beiden unterscheiden).