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序列化了。