使用场景:

对于一些简单的表,可以直接通过该方法将数据查询对象进行序列化操作,转成python中列表或字典结构,再展示给前端。

1、model_to_dict方法:对单个查询对象序列化
import json import datetime from flask_sqlalchemy import Model #对单个模型操作 def
model_to_dict(model, fields=None,exchange_fields=None): """ 将Flask
SQLAlchemy的模型对象转换为字典类型 :param: model : 模型对象 :param: fields : 需要获取的字段列表,默认为
None,获取全部字段 :param: exchange_fields :
需要替换名字的字段,{'数据库字段':'前端展示字段'},有些数据库字段名在展示时需要修改成前端需要的名字 :return: 返回字典类型 """
#传递空值时 if not model: return {} #传递的对象不是查询数据库对象时,异常报错 if not
isinstance(model,Model): raise Exception('单个数据库查询对象转成字典,传递的查询对象类型有问题') if
fields is None: # 获取所有列名 columns = [column.name for column in
model.__table__.columns] # 排除掉relationships 设置的反向查询字段 relations =
getattr(model.__class__, '__mapper__').relationships exclude_cols = [rel.key
for rel in relations] # print(exclude_cols,'要剔除的反向查询字段') #拿到所有列名-排除的列名 cols =
set(columns) - set(exclude_cols) fields = list(cols) obj_dict = {} for field in
fields: if field not in model.__dict__: continue value = model.__dict__[field]
#1、对时间字段进行操作 if isinstance(value, datetime.datetime): #字段类型是datetime的,格式化 value
= value.strftime('%Y-%m-%d %H:%M:%S') if isinstance(value,datetime.date):
#字段类型是date的,格式化 value = value.strftime('%Y-%m-%d')
#2、将所有可以进行反序列化的进行反序列化(将json字符串转成python结构数据类型) if isinstance(value,str): try:
value = json.loads(value) except Exception as _: pass #3、替换展示的字段 if
type(exchange_fields) == dict: for db_field,show_field in
exchange_fields.items(): #db_field 是数据库字段,show_field是展示字段名 if field==db_field:
field = show_field obj_dict[field] = value return obj_dict
2、model_to_list方法:查询结果是list时,对多个查询对象序列化
#对数据集操作 def model_to_dict_list(queryset,fields=None,exchange_fields=None):
#1、空对象操作 if not queryset: return [] #2、数据类型控制 first = queryset[0] if not
isinstance(first,Model): raise
Exception('将数据对象转成python结构数据失败,传递进来的不是正确的模型对象列表') #3、循环操作 ret = [] for obj in
queryset: dic =
model_to_dict(obj,fields=fields,exchange_fields=exchange_fields)
ret.append(dic) return ret

技术
今日推荐
PPT
阅读数 135
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:766591547
关注微信