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操作时间和日期之asctime()方法的使用
May 22 Python
python线程池(threadpool)模块使用笔记详解
Nov 17 Python
200 行python 代码实现 2048 游戏
Jan 12 Python
Windows环境下python环境安装使用图文教程
Mar 13 Python
python list删除元素时要注意的坑点分享
Apr 18 Python
Python2和Python3的共存和切换使用
Apr 12 Python
创建Django项目图文实例详解
Jun 06 Python
python 默认参数相关知识详解
Sep 18 Python
用Python生成HTML表格的方法示例
Mar 06 Python
Python通过文本和图片生成词云图
May 21 Python
keras处理欠拟合和过拟合的实例讲解
May 25 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
May 28 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数组去重实例及分析
2013/11/26 PHP
PHP中比较时间大小实例
2014/08/21 PHP
ioncube_loader_win_5.2.dll的错误解决方法
2015/01/04 PHP
php+mongodb判断坐标是否在指定多边形区域内的实例
2016/10/28 PHP
载入jQuery库的最佳方法详细说明及实现代码
2012/12/28 Javascript
如何防止回车(enter)键提交表单
2014/05/11 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
2014/11/08 Javascript
JS简单操作select和dropdownlist实例
2014/11/26 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
2016/05/05 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
react路由配置方式详解
2017/08/07 Javascript
详解webpack3如何正确引用并使用jQuery库
2017/08/26 jQuery
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
Vue组件通信的四种方式汇总
2018/02/08 Javascript
新手快速入门JavaScript装饰者模式与AOP
2019/06/24 Javascript
layui 对弹窗 form表单赋值的实现方法
2019/09/04 Javascript
js实现随机div颜色位置 类似满天星效果
2019/10/24 Javascript
浅谈js中的attributes和Attribute的用法与区别
2020/07/16 Javascript
Vue环境搭建+VSCode+Win10的详细教程
2020/08/19 Javascript
微信小程序使用前置摄像头拍照
2020/10/22 Javascript
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
Python利用前序和中序遍历结果重建二叉树的方法
2016/04/27 Python
python3编码问题汇总
2016/09/06 Python
Python编程实现二分法和牛顿迭代法求平方根代码
2017/12/04 Python
python实现快速排序的示例(二分法思想)
2018/03/12 Python
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
python中比较两个列表的实例方法
2019/07/04 Python
python处理自动化任务之同时批量修改word里面的内容的方法
2019/08/23 Python
Tensorflow限制CPU个数实例
2020/02/06 Python
Pygame的程序开始示例代码
2020/05/07 Python
台湾饭店和机票预订网站:Expedia台湾
2016/08/05 全球购物
Dr. Martens马汀博士法国官网:马丁靴鼻祖
2020/01/15 全球购物
技校毕业生自荐书
2014/05/23 职场文书
我的梦想演讲稿1000字
2014/08/21 职场文书
个人授权委托书样本
2014/09/13 职场文书
Python包argparse模块常用方法
2021/06/04 Python