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使用pickle模块存储数据报错解决示例代码
Jan 26 Python
numpy中以文本的方式存储以及读取数据方法
Jun 04 Python
PHP实现发送和接收JSON请求
Jun 07 Python
浅谈Python 递归算法指归
Aug 22 Python
python 进程 进程池 进程间通信实现解析
Aug 23 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
Jan 16 Python
Python函数式编程实例详解
Jan 17 Python
python利用datetime模块计算程序运行时间问题
Feb 20 Python
Python远程方法调用实现过程解析
Jul 28 Python
Django如何在不停机的情况下创建索引
Aug 02 Python
Python scrapy爬取起点中文网小说榜单
Jun 13 Python
Python中的 enumerate和zip详情
May 30 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 模拟$_PUT实现代码
2010/03/15 PHP
PHP中模拟处理HTTP PUT请求的例子
2014/07/22 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
2019/10/10 PHP
javascript 面向对象全新理练之数据的封装
2009/12/03 Javascript
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
JavaScript 语言的递归编程
2010/05/18 Javascript
jquery的ajax请求全面了解
2013/03/20 Javascript
extjs ColumnChart设置不同的颜色实现代码
2013/05/17 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
学习JavaScript正则表达式
2015/11/13 Javascript
浅谈jQuery 中的事件冒泡和阻止默认行为
2016/05/28 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
JavaScript在控件上添加倒计时功能的实现代码
2017/07/04 Javascript
浅析Angular19 自定义表单控件
2018/01/31 Javascript
通过一次报错详细谈谈Point事件
2018/05/17 Javascript
React降级配置及Ant Design配置详解
2018/12/27 Javascript
Vue3.x源码调试的实现方法
2019/10/13 Javascript
解决vue项目中出现Invalid Host header的问题
2020/11/17 Javascript
python爬取网站数据保存使用的方法
2013/11/20 Python
使用Python实现简单的服务器功能
2017/08/25 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
2018/02/05 Python
关于python中密码加盐的学习体会小结
2019/07/15 Python
python生成器用法实例详解
2019/11/22 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
python yield和Generator函数用法详解
2020/02/10 Python
python下对hsv颜色空间进行量化操作
2020/06/04 Python
Amara德国:家居饰品、设计师品牌和豪华礼品
2019/05/20 全球购物
工地资料员岗位职责
2013/12/31 职场文书
法警的竞聘演讲稿
2014/01/02 职场文书
大学生年度个人总结
2015/02/15 职场文书
2015年小学数学教研组工作总结
2015/05/21 职场文书
雨雪天气温馨提示
2015/07/15 职场文书
我的生日感言
2015/08/03 职场文书