开始,第一个方法之前,我们要来认识一下   dict()  这个函数, 它的传入参数可以是一个对象,

但前提是这个对象的内部有 keys()方法返回转成字典所包含的键的列表

并且,该对象的内部实现了 __item__()方法

如下图:是没有实现这两个方法的类,代码报错:

当我们在类的上面实现keys()和 __getItem__()方法时,就可以了

有了以上的认识,我的想法是,在sqlalchemy 的db.models的类的定义中加上这两个方法,实现orm模型对象转换为数组

 

当我们视图函数中使用query.all()等查询出结果以后是  一个 list的列表,然后对列表中的每一个元素(其是就是一个orm模型),使用dict(orm模型),就可以了

以上就是第一种方法,不方便的地方在于,取出数据后,还要再遍历一次,加上dict()函数

感叹一下,还是php中的数组强大,json_encode(array), 就解决了,这点python真赶不上php

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

现在再来说一下,第二种方法

直接上代码吧,代码中的注释应该可以看懂

 

def query2dict(model_list):
    if isinstance(model_list,list):  #如果传入的参数是一个list类型的,说明是使用的all()的方式查询的
        if isinstance(model_list[0],db.Model):   # 这种方式是获得的整个对象  相当于 select * from table
            lst = []
            for model in model_list:
                dic = {}
                for col in model.__table__.columns:
                    dic[col.name] = getattr(model,col.name)
                lst.append(dic)
            return lst
        else:                           #这种方式获得了数据库中的个别字段  相当于select id,name from table
            lst = []
            for result in model_list:   #当以这种方式返回的时候,result中会有一个keys()的属性
                lst.append([dict(zip(result.keys, r)) for r in result])
            return lst
    else:                   #不是list,说明是用的get() 或者 first()查询的,得到的结果是一个对象
        if isinstance(model_list,db.Model):   # 这种方式是获得的整个对象  相当于 select * from table limit=1
            dic = {}
            for col in model_list.__table__.columns:
                dic[col.name] = getattr(model_list,col.name)
            return dic
        else:    #这种方式获得了数据库中的个别字段  相当于select id,name from table limit = 1
            return dict(zip(model_list.keys(),model_list))

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐