Untuk mendapatkan as_dict
metode di semua kelas saya, saya menggunakan Mixin
kelas yang menggunakan teknik yang dijelaskan oleh Semut 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
Dan kemudian gunakan seperti ini di kelas Anda
class MyClass(BaseMixin, Base):
pass
Dengan cara itu Anda dapat memanggil yang berikut pada sebuah instance MyClass
.
> myclass = MyClass()
> myclass.as_dict()
Semoga ini membantu.
Saya telah bermain-main dengan ini sedikit lebih jauh, saya sebenarnya perlu membuat instance saya dict
sebagai bentuk objek HAL dengan tautannya ke objek terkait. Jadi saya telah menambahkan sihir kecil ini di sini, yang akan merayapi semua properti kelas yang sama seperti di atas, dengan perbedaan bahwa saya akan merayapi lebih dalam ke Relaionship
properti dan membuatnya links
secara otomatis.
Harap dicatat bahwa ini hanya akan berfungsi untuk hubungan yang memiliki kunci utama tunggal
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
akan memberi Anda nama kolom SQL, bukan nama atribut yang Anda gunakan dalam definisi ORM Anda (jika keduanya berbeda).