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 15 Python
python实现上传下载文件功能
Nov 19 Python
解决python使用open打开文件中文乱码的问题
Dec 29 Python
python3使用SMTP发送HTML格式邮件
Jun 19 Python
tensorflow实现逻辑回归模型
Sep 08 Python
Python中的取模运算方法
Nov 10 Python
Python3.5实现的罗马数字转换成整数功能示例
Feb 25 Python
PyQt5实现简易电子词典
Jun 25 Python
详解python中__name__的意义以及作用
Aug 07 Python
Python 仅获取响应头, 不获取实体的实例
Aug 21 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
Sep 06 Python
LyScript实现绕过反调试保护的示例详解
Aug 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的安全
2006/10/09 PHP
最令PHP初学者们头痛的十四个问题
2007/01/15 PHP
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
2008/11/14 PHP
phpstorm编辑器乱码问题解决
2014/12/01 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
php-fpm添加service服务的例子
2018/04/27 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
javascript 对象的定义方法
2007/01/10 Javascript
jquery下利用jsonp跨域访问实现方法
2010/07/29 Javascript
jQuery学习笔记 更改jQuery对象
2012/09/19 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
jquery实现动态改变div宽度和高度
2015/05/08 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
解决vue中监听input只能输入数字及英文或者其他情况的问题
2018/08/30 Javascript
vue修改Element的el-table样式的4种方法
2020/09/17 Javascript
Django中处理出错页面的方法
2015/07/15 Python
Python中使用装饰器来优化尾递归的示例
2016/06/18 Python
python Socket之客户端和服务端握手详解
2017/09/18 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
2018/07/31 Python
Python制作微信好友背景墙教程(附完整代码)
2019/07/17 Python
Python使用百度api做人脸对比的方法
2019/08/28 Python
python实现实时视频流播放代码实例
2020/01/11 Python
基于Python数据分析之pandas统计分析
2020/03/03 Python
基于python图像处理API的使用示例
2020/04/03 Python
阿联酋航空官方网站:Emirates
2017/10/17 全球购物
会话Bean的种类
2013/11/07 面试题
土木工程专业个人求职信
2013/12/30 职场文书
学生会招新策划书
2014/02/14 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
英语辞职信怎么写
2015/02/28 职场文书
保险内勤岗位职责
2015/04/13 职场文书
新学期家长寄语2016
2015/12/03 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang
vite+vue3.0+ts+element-plus快速搭建项目的实现
2021/06/24 Vue.js