繼承 json.JSONEncoderpython
實現一個針對sqlalchemy返回類型的處理方式。sql
sqlalchemy的返回類型有大都有兩種,一種是Model對象,一種是Query集合(只查詢部分字段)。json
針對這兩種返回結果,都是來自同一中類型 sqlalchemy.orm.query.Query 數組
因此針對Query作相應處理,讓他返回一個dictapp
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)
這樣在每次序列化的時候就能夠簡單的使用code
json.dumps(result1, cls=AlchemyJsonEncoder)
來實現對結果集的json序列化了。orm