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 getopt 参数处理小示例
Jun 09 Python
在Python中操作字符串之startswith()方法的使用
May 20 Python
Python正则获取、过滤或者替换HTML标签的方法
Jan 28 Python
python机器学习理论与实战(六)支持向量机
Jan 19 Python
Pandas 对Dataframe结构排序的实现方法
Apr 10 Python
基于anaconda下强大的conda命令介绍
Jun 11 Python
Python3+Appium实现多台移动设备操作的方法
Jul 05 Python
pytorch 固定部分参数训练的方法
Aug 17 Python
Pandas时间序列:重采样及频率转换方式
Dec 26 Python
Tensorflow 模型转换 .pb convert to .lite实例
Feb 12 Python
详解Python IO编程
Jul 24 Python
如何利用Python matplotlib绘制雷达图
Dec 21 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安全编程之加密功能
2006/10/09 PHP
PHP 编写的 25个游戏脚本
2009/05/11 PHP
php中一个有意思的日期逻辑处理
2012/03/25 PHP
ThinkPHP查询中的魔术方法简述
2014/06/25 PHP
php防止网站被攻击的应急代码
2015/10/21 PHP
php简单获取复选框值的方法
2016/05/11 PHP
PHP编写文件多服务器同步程序
2016/07/02 PHP
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
js中的scroll和offset 使用比较的实例与分析
2013/09/29 Javascript
JavaScript中的getDay()方法使用详解
2015/06/09 Javascript
详解js跨域原理以及2种解决方案
2015/12/09 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
2016/11/15 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
Bootstrap select实现下拉框多选效果
2016/12/23 Javascript
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
微信小程序使用picker实现时间和日期选择框功能【附源码下载】
2017/12/11 Javascript
浅谈Postman解决token传参的问题
2018/03/31 Javascript
微信小程序学习笔记之本地数据缓存功能详解
2019/03/29 Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
2019/05/22 Javascript
[01:34]2016国际邀请赛中国区预选赛IG战队教练采访
2016/06/27 DOTA
[53:29]完美世界DOTA2联赛循环赛 DM vs Matador BO2第二场 11.04
2020/11/05 DOTA
Python3简单实现串口通信的方法
2019/06/12 Python
Django的CVB实例详解
2020/02/10 Python
基于opencv实现简单画板功能
2020/08/02 Python
匡威荷兰官方网站:Converse荷兰
2018/10/24 全球购物
公司拓展活动方案
2014/02/13 职场文书
违反工作规定检讨书范文
2014/12/14 职场文书
圣诞晚会主持词开场白
2015/05/28 职场文书
心理健康教育主题班会
2015/08/13 职场文书
2019学生会干事辞职信
2019/06/27 职场文书
react如何快速设置文件路径别名
2021/04/28 Javascript
SQL Server使用导出向导功能
2022/04/08 SQL Server
MySql重置root密码 --skip-grant-tables
2022/04/11 MySQL
MySQL transaction事务安全示例讲解
2022/06/21 MySQL