Flask框架-数据库查询对象转字典或列表:实现model

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

使用场景

对于一些简单的表可以直接通过该方法将数据查询对象进行序列化操作转成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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: 数据库