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中使用sys模板和logging模块获取行号和函数名的方法
Apr 15 Python
详解Python中的装饰器、闭包和functools的教程
Apr 02 Python
python实现查找两个字符串中相同字符并输出的方法
Jul 11 Python
Python文件的读写和异常代码示例
Oct 31 Python
python中字符串变二维数组的实例讲解
Apr 03 Python
Python实现合并excel表格的方法分析
Apr 13 Python
详解Python3序列赋值、序列解包
May 14 Python
Python 字符串、列表、元组的截取与切片操作示例
Sep 17 Python
python中for in的用法详解
Apr 17 Python
解决reload(sys)后print失效的问题
Apr 25 Python
Python reduce函数作用及实例解析
May 08 Python
Cpython解释器中的GIL全局解释器锁
Nov 09 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采集神器cURL使用方法详解
2016/02/19 PHP
php函数传值的引用传递注意事项分析
2016/06/25 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
2019/10/17 PHP
对采用动态原型方式无法展示继承机制得思考
2009/12/04 Javascript
js 实现无干扰阴影效果 简单好用(附文件下载)
2009/12/27 Javascript
了解jQuery技巧来提高你的代码
2010/01/08 Javascript
只需20行代码就可以写出CSS覆盖率测试脚本
2013/04/24 Javascript
使用focus方法让光标默认停留在INPUT框
2014/07/29 Javascript
js实现屏幕自适应局部代码分享
2015/01/30 Javascript
jQuery实现的仿select功能代码
2015/08/19 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
2016/05/25 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
Vue.js在使用中的一些注意知识点
2017/04/29 Javascript
Js自定义多选框效果的实例代码
2017/07/05 Javascript
weex里Vuex state使用storage持久化详解
2017/09/09 Javascript
vue.js 图片上传并预览及图片更换功能的实现代码
2018/08/27 Javascript
使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置
2018/11/02 Javascript
extjs图形绘制之饼图实现方法分析
2020/03/06 Javascript
线程和进程的区别及Python代码实例
2015/02/04 Python
python 接口_从协议到抽象基类详解
2017/08/24 Python
Python人脸识别初探
2017/12/21 Python
python检测主机的连通性并记录到文件的实例
2018/06/21 Python
基于DataFrame改变列类型的方法
2018/07/25 Python
python同时遍历数组的索引和值的实例
2018/11/15 Python
Django restframework 源码分析之认证详解
2019/02/22 Python
Django框架首页和登录页分离操作示例
2019/05/28 Python
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
CSS中几个与换行有关的属性简明总结
2014/04/15 HTML / CSS
苹果Mac升级:MacSales.com
2017/11/20 全球购物
大学生涯自我鉴定
2014/01/16 职场文书
商业用房租赁协议书
2014/10/13 职场文书
检讨书范文2000字
2015/01/28 职场文书
岳庙导游词
2015/02/04 职场文书
《时代广场的蟋蟀》读后感:真挚友情,温暖世界!
2020/01/08 职场文书
python使用pymysql模块操作MySQL
2021/06/16 Python