为了在我所有的类中获取一个
as_dict
方法,我使用了一个
Mixin
类,该类使用了
Ants Aasma所描述的技术。请注意保留HTML标签。
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
然后在你的类中像这样使用它
class MyClass(BaseMixin, Base):
pass
那么你可以在
MyClass
的实例上调用以下内容。
> myclass = MyClass()
> myclass.as_dict()
希望这可以帮助到您。
我进一步尝试了一下,实际上需要将我的实例呈现为字典形式,作为一个
HAL对象,并链接到相关对象。因此,我添加了下面这个小魔术,它将遍历类的所有属性,与上述相同,不同之处在于我会更深入地遍历
Relaionship
属性,并自动生成这些属性的
链接
。
请注意,这仅适用于具有单个主键的关系。
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):
continue
if isinstance(prop, ColumnProperty):
result[prop.key] = getattr(self, prop.key)
if isinstance(prop, RelationshipProperty):
if 'links' not in result:
result['links'] = {}
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
会给出SQL字段名,而不是您在ORM定义中使用的属性名(如果两者不同)。 - Josh Kelley'_sa_' != k[:4]
更改为not k.startswith('_sa_')
,这样更易懂。 - Mu Mindinspect(JobStatus).columns.keys()
- kirpitmodel.__dict__[column]
设置值,SQLAlchemy 将无法检测到更改。 - Sebi2020