You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
30 lines
1.2 KiB
30 lines
1.2 KiB
from sqlalchemy.ext.declarative import DeclarativeMeta
|
|
import datetime
|
|
import json
|
|
|
|
#sqlalchemy对象编码转换类
|
|
class AlchemyEncoder(json.JSONEncoder):
|
|
def default(self, obj):
|
|
if isinstance(obj.__class__, DeclarativeMeta):
|
|
#SQLAlchemy类
|
|
fields = {}
|
|
for field in [x for x in dir(obj) if not x.startswith('_') and x != 'metadata']:
|
|
data = obj.__getattribute__(field)
|
|
try:
|
|
json.dumps(data) # 序列化对象
|
|
fields[field] = data
|
|
except TypeError: # 添加了对datetime的处理
|
|
if isinstance(data, datetime.datetime):
|
|
fields[field] = data.isoformat()
|
|
elif isinstance(data, datetime.date):
|
|
fields[field] = data.isoformat()
|
|
elif isinstance(data, datetime.timedelta):
|
|
fields[field] = (datetime.datetime.min + data).time().isoformat()
|
|
else:
|
|
fields[field] = None
|
|
# Json编码字典
|
|
return fields
|
|
|
|
return json.JSONEncoder.default(self, obj)
|
|
|