Сериализация на самом деле не может быть обобщена для всех возможных классов, сопоставленных с sqlalchemy, классы могут иметь свойства, которые не хранятся в базе данных, или которые должны выводиться на нескольких уровнях косвенного обращения через свойства relationship
. Короче говоря, только вы знаете, как сериализовать определенный класс для конкретного использования.
Предположим, что вам нужны значения столбцов или заботятся о них только для конкретного экземпляра рассматриваемого конкретного класса (в res
). Вот грубая функция, которая будет возвращать dict, содержащий только эти значения.
from sqlalchemy.orm.attributes import manager_of_class
from sqlalchemy.orm.properties import ColumnProperty
def get_state_dict(instance):
cls = type(instance)
mgr = manager_of_class(cls)
return dict((key, getattr(instance, key))
for key, attr in mgr.iteritems()
if isinstance(attr.property, ColumnProperty))
и воссоздать экземпляр из диктата *
def create_from_state_dict(cls, state_dict):
mgr = manager_of_class(cls)
instance = mgr.new_instance()
for key, value in state_dict.iteritems():
setattr(instance, key, value)
return instance
Если вам нужно что-то более сложное, возможно, для обработки отношений, не показанных в виде столбцов (как в отношениях «многие ко многим»), вы, вероятно, можете добавить этот случай, выполнив поиск sqlalchemy.orm.properties.RelationshipProperty
, а затем перебрав коллекцию. 1015 *
* Сериализация промежуточного слова и класса оставлена в качестве упражнения.