Per ottenere un as_dictmetodo su tutte le mie classi ho utilizzato una Mixinclasse che utilizza le tecniche descritte da Ants Aasma .
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
E poi usalo in questo modo nelle tue classi
class MyClass(BaseMixin, Base):
pass
In questo modo puoi richiamare quanto segue su un'istanza di MyClass.
> myclass = MyClass()
> myclass.as_dict()
Spero che questo ti aiuti.
Ho giocato un po 'più a fondo con questo, in realtà avevo bisogno di rendere le mie istanze dictcome la forma di un oggetto HAL con i suoi collegamenti agli oggetti correlati. Quindi ho aggiunto questa piccola magia quaggiù, che scansionerà tutte le proprietà della classe come sopra, con la differenza che scansionerò più in profondità nelle Relaionshipproprietà e genererò linksautomaticamente per queste.
Tieni presente che questo funzionerà solo per le relazioni che hanno un'unica chiave primaria
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__.columnsti fornirà i nomi dei campi SQL, non i nomi degli attributi che hai usato nelle definizioni ORM (se i due differiscono).