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 内置函数complex详解
Oct 23 Python
详解通过API管理或定制开发ECS实例
Sep 30 Python
Python3.5局部变量与全局变量作用域实例分析
Apr 30 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
Jun 18 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
python openpyxl使用方法详解
Jul 18 Python
Python 中 -m 的典型用法、原理解析与发展演变
Nov 11 Python
Python 实现加密过的PDF文件转WORD格式
Feb 04 Python
pytorch实现Tensor变量之间的转换
Feb 17 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
May 03 Python
彻底解决pip下载pytorch慢的问题方法
Mar 01 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
Jun 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
截获网站title标签之家内容的例子
2006/10/09 PHP
php array的学习笔记
2012/05/10 PHP
PHP里的单例类写法实例
2015/06/25 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
php 数组元素快速去重
2017/05/05 PHP
prototype Element学习笔记(Element篇三)
2008/10/26 Javascript
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
PHP PDO操作总结
2014/11/17 Javascript
详解javascript遍历方式
2015/11/11 Javascript
分享一个插件实现水珠自动下落效果
2016/06/01 Javascript
jQuery中show与hide方法用法示例
2016/09/16 Javascript
React Native实现简单的登录功能(推荐)
2016/09/19 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
JQuery实现定时刷新功能代码
2017/05/09 jQuery
微信小程序 navbar实例详解
2017/05/11 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
2017/09/04 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
2017/09/21 jQuery
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
详解如何在react中搭建d3力导向图
2018/01/12 Javascript
Vue常见面试题整理【值得收藏】
2018/09/20 Javascript
webpack file-loader和url-loader的区别
2019/01/15 Javascript
详解 微信小程序开发框架(MINA)
2019/05/17 Javascript
Vue按时间段查询数据组件使用详解
2020/08/21 Javascript
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
python实现系统状态监测和故障转移实例方法
2013/11/18 Python
python下MySQLdb用法实例分析
2015/06/08 Python
python 使用正则表达式按照多个空格分割字符的实例
2018/12/20 Python
解决PySide+Python子线程更新UI线程的问题
2019/01/11 Python
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
2019/02/22 Python
Python中print和return的作用及区别解析
2019/05/05 Python
Python 多线程其他属性以及继承Thread类详解
2019/08/28 Python
菲律宾旅游网站:Expedia菲律宾
2017/10/11 全球购物
学习经验演讲稿
2014/05/10 职场文书
2015共产党员公开承诺书
2015/01/22 职场文书
2015小学教师年度工作总结
2015/05/12 职场文书
Python获取百度热搜的完整代码
2021/04/07 Python