1、模型转Json时需要对一些特殊格式进行处理 比如金额(decimal)、和时间(datetime)
import json
import datetime
from decimal import Decimal,getcontext
class DateEncoder(json.JSONEncoder):
def default(self, obj):
"""
重新 JSONEncoder 转换方式
:param obj:
:return:
"""
if isinstance(obj, Decimal):
return float(obj)
elif isinstance(obj, datetime.datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(obj, datetime.date):
return obj.strftime("%Y-%m-%d")
else:
return json.JSONEncoder.default(self, obj)
2、统一模型转换Json格式,一般给前端的有三个字段,code:返回值代码 标识返回数据的状态,msg:返回提示信息,data:返回的数据结果
class ResultModel():
def __init__(self,code=0,msg="success",data=None):
"""
:param code: 0 成功,1 失败
:param msg: 原因说明
:param data: 请求结果
"""
self.code = code
self.msg = msg
is_list = data.__class__ == [].__class__
is_set = data.__class__ == set().__class__
if(is_set or is_list):
sub = []
for item in data:
a = self.to_dict(item)
sub.append(a)
self.data = sub
else:
self.data = data
def to_json(self):
"""
模型转换为 json字符串,DateEncoder自定义转换模式
:return:
"""
return json.dumps(obj=self.__dict__,ensure_ascii=False,cls=DateEncoder)
def to_dict(self,item):
"""
字典转换
:param item:
:return:
"""
dict = {}
dict.update(item.__dict__)
return dict
4、调用 提供给web端,用tornado框架 举例
t = tsql()
class webHandler(tornado.web.RequestHandler):
@tornado.web.authenticated
def get(self, *args, **kwargs):
try:
data = t.selectdata()
_re = ResultModel(data=data)
self.write(_re.to_json())
except Exception as e:
_re = ResultModel(code=1,msg=str(e.args))
self.write(_re.to_json())
5、_re.to_josn() 结果
{
"code": 0,
"data": [{"price": 22.0, "id": 1, "createtime": "2020-01-07 21:46:34"},
{"price": 1234567890.22, "id": 2, "createtime": "2020-01-07 21:46:57"},
{"price": 10.0, "id": 3, "createtime": "2020-01-08 03:12:56"},
{"price": 10.23, "id": 4, "createtime": "2020-01-08 03:15:52"},
{"price": 10.24, "id": 5, "createtime": "2020-01-08 03:16:03"},
{"price": 10.24, "id": 6, "createtime": "2020-01-08 03:18:49"}],
"msg": "success"
}