Python flask sqlalchemy返回数据转字典dict

#!/user/bin/python3
# -*- codeing:utf-8 -*-
# Time : 2018/9/10 9:48
# Author : LiuShiHua
# Desc :


from db_manager import TTDModel
from sqlalchemy.util._collections import AbstractKeyedTuple
import datetime
import decimal

format_ymdhms = "%Y-%m-%d %H:%M:%S"


#
# AbstractKeyedTuple  特定返回某些字段时会返回这个数据类型
# TTDModel 是自定义sqlalchemy类的父类,其中重写了to_dict()函数,控制了输出
# isinstance(obj,class)判断obj是不是class类或其子类,是返回True,不是则返回False
# 数据库返回数据list 转 dict
#
def db_datalist_to_dict(res_obj):
    if not res_obj:
        return None
    if isinstance(res_obj, list):  # 列表解析
        if len(res_obj) == 0:
            return None
        if isinstance(res_obj[0], AbstractKeyedTuple):  #
            dic_list = datalist_format([dict(zip(result.keys(), result)) for result in res_obj])
            if dic_list:
                for item in dic_list:
                    for key in item.keys():
                        if key.find("Id") >= 0 or key.find("uuid") >= 0 or key.find("_id") >= 0:
                            item[key] = str(item[key])
            return dic_list
        elif isinstance(res_obj[0], TTDModel):
            [item.__dict__.pop("_sa_instance_state") for item in res_obj]
            return datalist_format([item.__dict__ for item in res_obj])
        elif isinstance(res_obj[0], dict):  #在db中存在json字段时返回的是dict
            return datalist_format(res_obj)
        else:
            return None
    else:
        return db_data_to_dict(res_obj)

#
# 数据库返回单个数据 转 dict
#
def db_data_to_dict(res_obj):
    if not res_obj:
        return None
    if isinstance(res_obj, dict):
        return res_obj
    elif isinstance(res_obj, AbstractKeyedTuple):
        # 转成字典
        dict_obj = data_format(dict(zip(res_obj.keys(), res_obj)))
        # 把null 转空字符串
        if res_obj and len(res_obj.keys()) > 0:
            for key in res_obj.keys():
                if not dict_obj[key]:
                    dict_obj[key] = ""
                if key.find("Id") >= 0 or key.find("uuid") >= 0 or key.find("_id") >= 0:
                    dict_obj[key] = str(dict_obj[key])

        return dict_obj
    elif isinstance(res_obj, TTDModel):
        res_obj.__dict__.pop("_sa_instance_state")
        return data_format(res_obj.__dict__)
    else:
        return None


def datalist_format(reslist):
    """
    列表 中 时间格式datetime.datetime  转 [2018:12:12 10:10:56]
    :param res: 列表
    :return:
    """
    if not reslist or not isinstance(reslist, list):
        return reslist
    for item in reslist:
        for key in item.keys():
            if isinstance(item[key], datetime.datetime) \
                    or isinstance(item[key], datetime.date):
                item[key] = str(item[key])
            if isinstance(item[key], decimal.Decimal):
                item[key] = float(item[key])
    return reslist


def data_format(bean):
    """
    对象 中 时间格式datetime.datetime  转 [2018:12:12 10:10:56]
    :param bean: 传入dict
    :return:
    """
    if not bean or not isinstance(bean, dict):
        return bean
    for key in bean.keys():
        if isinstance(bean[key], datetime.datetime) \
                or isinstance(bean[key], datetime.date):
            bean[key] = str(bean[key])
        if isinstance(bean[key], decimal.Decimal):
            bean[key] = float(bean[key])
    return bean

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值