as_dict
Tüm sınıflarımda bir yöntem elde etmek için Mixin
, Ants Aasma tarafından açıklanan teknikleri kullanan bir sınıf kullandım .
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
Ve sonra bunu sınıflarınızda böyle kullanın
class MyClass(BaseMixin, Base):
pass
Bu şekilde aşağıdakileri bir örneğinde çağırabilirsiniz MyClass
.
> myclass = MyClass()
> myclass.as_dict()
Bu yardımcı olur umarım.
Bununla ilgili biraz daha fazla oynadım, aslında örneklerimi ilgili nesnelere bağlantıları dict
olan bir HAL nesnesi biçiminde oluşturmam gerekiyordu. Bu yüzden buraya bu küçük sihri ekledim, sınıfın tüm özellikleri üzerinde yukarıdakilerle aynı şekilde gezinecek, aradaki fark, Relaionship
özelliklerin daha derinlerine inecek ve links
bunlar için otomatik olarak üreteceğim .
Lütfen bunun yalnızca tek bir birincil anahtara sahip ilişkiler için işe yarayacağını unutmayın
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
size SQL alan adlarını değil, (iki farklı ise) size ORM tanımlarında kullandım Özellik adlarının verecektir.