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生成日历实例解析
Aug 21 Python
详解Django中的form库的使用
Jul 18 Python
在windows系统中实现python3安装lxml
Mar 23 Python
带你了解python装饰器
Jun 15 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
Sep 26 Python
python 巧用正则寻找字符串中的特定字符的位置方法
May 02 Python
python读取图片并修改格式与大小的方法
Jul 24 Python
python面向对象 反射原理解析
Aug 12 Python
对python中UDP,socket的使用详解
Aug 22 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
Mar 06 Python
基于Python实现体育彩票选号器功能代码实例
Sep 16 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
Jan 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中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
通过Email发送PHP错误的方法
2015/07/20 PHP
[原创]php实现 data url的图片生成与保存
2016/12/04 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
jQuery 全选效果实现代码
2009/03/23 Javascript
网页加载时页面显示进度条加载完成之后显示网页内容
2012/12/23 Javascript
js中事件的处理与浏览器对象示例介绍
2013/11/29 Javascript
用于deeplink的js方法(判断手机是否安装app)
2014/04/02 Javascript
高性能JavaScript DOM编程(1)
2015/08/11 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
2016/12/01 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
2016/12/13 Javascript
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
2017/03/08 Javascript
JavaScript禁用右键单击优缺点分析
2019/01/20 Javascript
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
[06:09]辉夜杯主赛事开幕式
2015/12/25 DOTA
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
python用字典统计单词或汉字词个数示例
2014/04/22 Python
python使用chardet判断字符串编码的方法
2015/03/13 Python
Python实现购物系统(示例讲解)
2017/09/13 Python
Python设计模式之MVC模式简单示例
2018/01/10 Python
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
python3.4 将16进制转成字符串的实例
2019/06/12 Python
django 邮件发送模块smtp使用详解
2019/07/22 Python
Python @property使用方法解析
2019/09/17 Python
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
巴西在线鞋店:Shoestock
2017/10/28 全球购物
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
企业诚信承诺书
2014/05/23 职场文书
地震捐款倡议书
2014/08/29 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
民主评议政风行风整改方案
2014/09/17 职场文书
领导班子四风对照检查材料范文
2014/09/27 职场文书
2016年最美孝心少年事迹材料
2016/02/26 职场文书
如何制定销售人员薪酬制度?
2019/07/09 职场文书
Python基础 括号()[]{}的详解
2021/11/07 Python