Django ORM filter() 的运用详解


Posted in Python onMay 14, 2020

最近发布代码的时候,遇到一个问题,发现Python中eval()函数的危险性.然而我还是个菜鸟,其中有一段代码是这样的。

queryset = eval("models.TUserInfo.objects.filter({0})[{1}:{2}]".format(select,page_num * page - page_num,page_num * page))

代码场景:

这是一个获取信息的API.所以需要去数据库里取对应信息,但是你不知道获取信息是根据哪几个字段而来,需要靠用户传入,在这里eval()函数就提供给某些人员很好的入侵性.所以用了另外一种方式去改良代码.

filter(**kwargs): 它包含了与所给筛选条件相匹配的对象

条件查询

条件可以是:参数,字典,Q

def filter(self, *args, **kwargs):
    """
    Returns a new QuerySet instance with the args ANDed to the existing
    set.
    """
    return self._filter_or_exclude(False, *args, **kwargs)

于是乎,便改用了字典传值的方式.避免了先将代码字符串化,然后在将其代码化。

用**dict调用,dict必须是一个字典。

queryset = models.TUserInfo.objects.filter(**field_dict)[page_num * page - page_num:page_num * page]

因为没有想到用其它方式来运用orm,所以有些新奇,用字典传值也不失为一种良好运用。

补充知识:django orm查询中filter与get的区别

输入参数:

get的参数只能是model中定义的哪些字段,只支持严格匹配

filter的参数可以是字段也可以是扩展的where查询关键字,如in,like

返回值:

get返回值是一个定义的model对象

filter返回值是一个新的QuerySet对象,然后可以对QuerySet在进行查询返回新的QuerySet对象,支持链式操作,QuerySet一个集合对象,可使用迭代或者遍历,切片等,但是不等于list类型(是一个object对象集合)

异常:

get只有一条记录返回的时候才正常,也就是说明get查询字段必须是主键或者唯一约束的字段。当返回多条记录或者没有找到记录的时候都会抛出异常

get方法是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话,它会报错,有多条记录也会报错。

filter有没有匹配的记录都可以

filter方法是从数据库的取得匹配的结果,返回一个对象列表,如果记录不存在的话,它会返回[]。

另外,从别的资料里看到filter好像有缓存数据的功能,第一次查询数据库并生成缓存,下次再调用filter方法的话,直接取得缓存的数据,会get方法每次执行都是直接查询数据库的,不知道这个是不是正确,看看就好。

以上这篇Django ORM filter() 的运用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python写入中英文字符串到文件的方法
May 06 Python
简单理解Python中的装饰器
Jul 31 Python
Python 逐行分割大txt文件的方法
Oct 10 Python
python实现图片处理和特征提取详解
Nov 13 Python
python之DataFrame实现excel合并单元格
Feb 22 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
May 19 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
Apr 25 Python
python远程邮件控制电脑升级版
May 23 Python
pytorch实现用CNN和LSTM对文本进行分类方式
Jan 08 Python
pandas DataFrame 数据选取,修改,切片的实现
Apr 24 Python
Python ckeditor富文本编辑器代码实例解析
Jun 22 Python
OpenCV Python实现图像指定区域裁剪
Mar 12 Python
Django设置Postgresql的操作
May 14 #Python
numpy矩阵数值太多不能全部显示的解决
May 14 #Python
使用python采集Excel表中某一格数据
May 14 #Python
django 模版关闭转义方式
May 14 #Python
Django表单提交后实现获取相同name的不同value值
May 14 #Python
django模板获取list中指定索引的值方式
May 14 #Python
Django admin管理工具TabularInline类用法详解
May 14 #Python
You might like
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
一致性哈希算法以及其PHP实现详细解析
2013/08/24 PHP
PHP fopen()和 file_get_contents()应用与差异介绍
2014/03/19 PHP
PHP中创建和验证哈希的简单方法实探
2015/07/06 PHP
php抽象方法和抽象类实例分析
2016/12/07 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
各种效果的jquery ui(接口)介绍
2008/09/17 Javascript
ajaxControlToolkit AutoCompleteExtender的用法
2008/10/30 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
2013/09/27 Javascript
jQuery中scrollTop()方法用法实例
2015/01/16 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
JS控制FileUpload的上传文件类型实例代码
2016/10/07 Javascript
从零开始学习Node.js系列教程一:http get和post用法分析
2017/04/13 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
详解ES6 export default 和 import语句中的解构赋值
2019/05/28 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
js最全的数组的降维5种办法(小结)
2020/04/28 Javascript
openlayers实现地图弹窗
2020/09/25 Javascript
python基础教程之循环介绍
2014/08/29 Python
python判断字符串是否纯数字的方法
2014/11/19 Python
Python中使用PyQt把网页转换成PDF操作代码实例
2015/04/23 Python
python如何实现excel数据添加到mongodb
2015/07/30 Python
关于Python中异常(Exception)的汇总
2017/01/18 Python
基于Python3 逗号代码 和 字符图网格(详谈)
2017/06/22 Python
Python根据已知邻接矩阵绘制无向图操作示例
2018/06/23 Python
数以千计的折扣工业产品:ESE Direct
2018/05/20 全球购物
企业办公室主任岗位职责
2014/02/19 职场文书
新闻学专业求职信
2014/07/28 职场文书
教师作风建设剖析材料
2014/10/11 职场文书
2015年党小组工作总结
2015/05/26 职场文书
2019银行员工个人工作自我鉴定
2019/06/27 职场文书
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
2021/03/31 jQuery
Python中使用Opencv开发停车位计数器功能
2022/04/04 Python
vue里使用create, mounted调用方法
2022/04/26 Vue.js