Per ottenere un as_dict
metodo su tutte le mie classi ho utilizzato una Mixin
classe 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 dict
come 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 Relaionship
proprietà e genererò links
automaticamente 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__.columns
ti fornirà i nomi dei campi SQL, non i nomi degli attributi che hai usato nelle definizioni ORM (se i due differiscono).