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按照多个字符对字符串进行分割的方法
Mar 17 Python
在Python的Tornado框架中实现简单的在线代理的教程
May 02 Python
Python实现将DOC文档转换为PDF的方法
Jul 25 Python
python机器学习之神经网络(一)
Dec 20 Python
Python内置模块logging用法实例分析
Feb 12 Python
Python安装图文教程 Pycharm安装教程
Mar 27 Python
Python实现多进程的四种方式
Feb 22 Python
Mac 使用python3的matplot画图不显示的解决
Nov 23 Python
Python模块相关知识点小结
Mar 09 Python
pandas数据处理之绘图的实现
Jun 15 Python
基于django2.2连oracle11g解决版本冲突的问题
Jul 02 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
Oct 14 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+java实现自动新闻滚动窗口
2006/10/09 PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
php include和require的区别深入解析
2013/06/17 PHP
PHP基于cookie与session统计网站访问量并输出显示的方法
2016/01/15 PHP
JavaScript Base64编码和解码,实现URL参数传递。
2006/09/18 Javascript
ExtJs 表单提交登陆实现代码
2010/08/19 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
JS教程:window.location使用方法的区别介绍
2013/10/04 Javascript
Jquery Post处理后不进入回调的原因及解决方法
2014/07/15 Javascript
判断访客终端类型集锦
2015/06/05 Javascript
微信小程序 setData的使用方法详解
2017/04/20 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
浅谈python内置变量-reversed(seq)
2017/06/21 Python
简单谈谈python中的语句和语法
2017/08/10 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
selenium python浏览器多窗口处理代码示例
2018/01/15 Python
Django中cookie的基本使用方法示例
2018/02/03 Python
python3.6的venv模块使用详解
2018/08/01 Python
使用Django搭建web服务器的例子(最最正确的方式)
2019/08/29 Python
解决windows下python3使用multiprocessing.Pool出现的问题
2020/04/08 Python
Python3使用 GitLab API 进行批量合并分支
2020/10/15 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
检测浏览器对HTML5和CSS3支持度的方法
2015/06/25 HTML / CSS
HTML5公共页面提取作为公用代码的方法
2020/06/30 HTML / CSS
泰国办公用品购物网站:OfficeMate
2018/02/04 全球购物
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
德国玩具商店:Planet Happy DE
2021/01/16 全球购物
销售冠军获奖感言
2014/02/03 职场文书
幼儿园植树节活动总结
2014/07/04 职场文书
行政处罚告知书
2015/07/01 职场文书
公司庆典主持词
2015/07/04 职场文书
CSS Transition通过改变Height实现展开收起元素
2021/08/07 HTML / CSS
Python中的pprint模块
2021/11/27 Python