Pour obtenir une as_dict
méthode sur toutes mes classes, j'ai utilisé une Mixin
classe qui utilise les techniques décrites par 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
Et puis utilisez-le comme ça dans vos cours
class MyClass(BaseMixin, Base):
pass
De cette façon, vous pouvez appeler ce qui suit sur une instance de MyClass
.
> myclass = MyClass()
> myclass.as_dict()
J'espère que cela t'aides.
J'ai joué un peu plus loin avec cela, j'avais en fait besoin de rendre mes instances dict
sous la forme d'un objet HAL avec ses liens vers des objets associés. J'ai donc ajouté cette petite magie ici, qui explorera toutes les propriétés de la classe comme ci-dessus, à la différence que je vais explorer plus en profondeur les Relaionship
propriétés et les générer links
automatiquement.
Veuillez noter que cela ne fonctionnera que pour les relations ayant une seule clé primaire
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
cela vous donnera les noms de champs SQL, pas les noms d'attributs que vous avez utilisés dans vos définitions ORM (si les deux diffèrent).