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+selenium 获取一组元素属性值的实例
Jun 22 Python
python 地图经纬度转换、纠偏的实例代码
Aug 06 Python
python实现将多个文件分配到多个文件夹的方法
Jan 07 Python
Django重置migrations文件的方法步骤
May 01 Python
python自定义时钟类、定时任务类
Feb 22 Python
利用Python产生加密表和解密表的实现方法
Oct 15 Python
python OpenCV GrabCut使用实例解析
Nov 11 Python
Python 词典(Dict) 加载与保存示例
Dec 06 Python
python实现邮件循环自动发件功能
Sep 11 Python
Python threading模块condition原理及运行流程详解
Oct 05 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
Nov 20 Python
Django与数据库交互的实现
Jun 03 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
ThinkPHP自动填充实现无限级分类的方法
2014/08/22 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
2015/04/15 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
2016/01/04 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
jQuery 连续列表实现代码
2009/12/21 Javascript
基于Jquery的仿照flash放大图片效果代码
2011/03/16 Javascript
javascript垃圾收集机制与内存泄漏详细解析
2013/11/11 Javascript
jquery的父子兄弟节点查找示例代码
2014/03/03 Javascript
JS实现两表格里数据来回转移的方法
2015/05/28 Javascript
关于vue-resource报错450的解决方案
2017/07/24 Javascript
three.js中文文档学习之如何本地运行详解
2017/11/20 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
JavaScript学习笔记之数组基本操作示例
2019/01/09 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
Vue CLI3中使用compass normalize的方法
2019/05/30 Javascript
Vue.js组件props数据验证实现详解
2019/10/19 Javascript
design vue 表格开启列排序的操作
2020/10/28 Javascript
Jquery+javascript实现支付网页数字键盘
2020/12/21 jQuery
[45:56]Ti4正赛第一天 VG vs NEWBEE 3
2014/07/19 DOTA
举例讲解Python编程中对线程锁的使用
2016/07/12 Python
python绘制热力图heatmap
2020/03/23 Python
Python数据集切分实例
2018/12/08 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
pygame实现飞机大战
2020/03/11 Python
python怎么对数字进行过滤
2020/07/05 Python
Dr. Martens马汀博士官网:马丁靴始祖品牌
2016/10/15 全球购物
伦敦香水公司:The London Perfume Company
2019/11/13 全球购物
松材线虫病防治方案
2014/06/15 职场文书
党支部三会一课计划
2014/09/24 职场文书
2015年世界卫生日活动总结
2015/02/09 职场文书
门卫岗位职责
2015/02/09 职场文书
学生病假条范文
2015/08/17 职场文书
七年级上册生物的课件
2019/08/07 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers
TS 类型收窄教程示例详解
2022/09/23 Javascript