繼承 json.JSONEncoder
實現一個針對sqlalchemy返回類型的處理方式。
sqlalchemy的返回類型有大都有兩種,一種是Model對象,一種是Query集合(只查詢部分字段)。
針對這兩種返回結果,都是來自同一中類型 sqlalchemy.orm.query.Query
所以針對Query做相應處理,讓他返回一個dict
class AlchemyJsonEncoder(json.JSONEncoder):
def default(self, obj):
# 判斷是否是Query
if isinstance(obj, Query):
# 定義一個字典數組
fields = []
# 定義一個字典對象
record = {}
# 檢索結果集的行記錄
for rec in obj.all():
# 檢索記錄中的成員
for field in [x for x in dir(rec) if
# 過濾屬性
not x.startswith('_')
# 過濾掉方法屬性
and hasattr(rec.__getattribute__(x), '__call__') == False
# 過濾掉不需要的屬性
and x != 'metadata']:
data = rec.__getattribute__(field)
try:
record[field] = data
except TypeError:
record[field] = None
fields.append(record)
# 返回字典數組
return fields
# 其他類型的數據按照默認的方式序列化成JSON
return json.JSONEncoder.default(self, obj)
這樣在每次序列化的時候就可以簡單的使用
json.dumps(result1, cls=AlchemyJsonEncoder)
來實現對結果集的json序列化了。
