เพื่อให้ได้as_dict
เมธอดในคลาสทั้งหมดของฉันฉันใช้Mixin
คลาสที่ใช้เทคนิคที่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
แล้วใช้แบบนี้ในชั้นเรียนของคุณ
class MyClass(BaseMixin, Base):
pass
ด้วยวิธีนี้คุณสามารถเรียกสิ่งต่อไปนี้ในอินสแตนซ์ของMyClass
.
> myclass = MyClass()
> myclass.as_dict()
หวังว่านี่จะช่วยได้
ฉันได้เล่นกับสิ่งนี้ต่อไปอีกเล็กน้อยจริงๆแล้วฉันต้องแสดงผลอินสแตนซ์ของฉันdict
ในรูปแบบของวัตถุ HALโดยมีลิงก์ไปยังวัตถุที่เกี่ยวข้อง ดังนั้นฉันจึงได้เพิ่มเวทย์มนตร์เล็ก ๆ นี้ลงไปที่นี่ซึ่งจะรวบรวมข้อมูลคุณสมบัติทั้งหมดของคลาสเดียวกันกับด้านบนด้วยความแตกต่างที่ฉันจะรวบรวมข้อมูลลึกลงไปในRelaionship
คุณสมบัติและสร้างขึ้นlinks
สำหรับคุณสมบัติเหล่านี้โดยอัตโนมัติ
โปรดทราบว่าสิ่งนี้ใช้ได้เฉพาะกับความสัมพันธ์ที่มีคีย์หลักเดียว
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 ของคุณ (หากทั้งสองต่างกัน)