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入门篇之文件
Oct 20 Python
简洁的十分钟Python入门教程
Apr 03 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
Feb 26 Python
Numpy array数据的增、删、改、查实例
Jun 04 Python
NLTK 3.2.4 环境搭建教程
Sep 19 Python
Python统计分析模块statistics用法示例
Sep 06 Python
在Python中字符串、列表、元组、字典之间的相互转换
Nov 15 Python
python实现替换word中的关键文字(使用通配符)
Feb 13 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
Feb 27 Python
Pycharm+Python工程,引用子模块的实现
Mar 09 Python
Python通过类的组合模拟街道红绿灯
Sep 16 Python
python 6种方法实现单例模式
Dec 15 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 进程锁定问题分析研究
2009/11/24 PHP
ThinkPHP CURD方法之data方法详解
2014/06/18 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
PHP 微信支付类 demo
2015/11/30 PHP
PHP浮点数的一个常见问题
2016/03/10 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
ThinkPHP框架实现数据增删改
2017/05/07 PHP
基于laravel where的高级使用方法
2019/10/10 PHP
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
JS实现在Repeater控件中创建可隐藏区域的代码
2010/09/16 Javascript
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
2011/05/10 Javascript
javascript动画浅析
2012/08/30 Javascript
js正文内容高亮效果的实现方法
2013/06/30 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
jquery ajaxSubmit 异步提交的简单实现
2014/02/28 Javascript
js调用webservice构造SOAP进行身份验证
2016/04/27 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
node通过express搭建自己的服务器
2017/09/30 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
2019/04/17 Javascript
微信小程序-API接口安全详解
2019/07/16 Javascript
vue项目初始化到登录login页面的示例
2019/10/31 Javascript
原生js实现自定义滚动条组件
2021/01/20 Javascript
python爬虫入门教程之点点美女图片爬虫代码分享
2014/09/02 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
2017/09/30 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
三星新西兰官网:Samsung新西兰
2019/03/05 全球购物
环保专业大学生职业规划设计
2014/01/10 职场文书
转预备党员政审材料
2014/02/06 职场文书
党员公开承诺书内容
2014/05/20 职场文书
银行进社区活动总结
2014/07/07 职场文书
平安工地汇报材料
2014/08/19 职场文书
滞留工资返还协议书
2014/10/19 职场文书
2015年党建工作汇报材料
2015/06/25 职场文书
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL
Python读取和写入Excel数据
2022/04/20 Python