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 相关文章推荐
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
Jun 18 Python
python中星号变量的几种特殊用法
Sep 07 Python
Python实现查询某个目录下修改时间最新的文件示例
Aug 29 Python
在python中利用GDAL对tif文件进行读写的方法
Nov 29 Python
python学习开发mock接口
Apr 28 Python
利用pyuic5将ui文件转换为py文件的方法
Jun 19 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
Jan 09 Python
TensorFlow MNIST手写数据集的实现方法
Feb 05 Python
python matplotlib.pyplot.plot()参数用法
Apr 14 Python
tensorflow模型转ncnn的操作方式
May 25 Python
8种常用的Python工具
Aug 05 Python
Python如何快速找到多个字典中的公共键(key)
Apr 29 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之变量、常量学习笔记
2008/03/27 PHP
php 分库分表hash算法
2009/11/12 PHP
php牛逼的面试题分享
2013/01/18 PHP
推荐几个开源的微信开发项目
2014/12/28 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
2015/12/23 PHP
浅析Prototype的模板类 Template
2011/12/07 Javascript
extjs实现选择多表自定义查询功能 前台部分(ext源码)
2011/12/20 Javascript
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
jquery 通过name快速取值示例
2014/01/24 Javascript
jQuery点击改变class并toggle及toggleClass()方法定义用法
2015/12/11 Javascript
angularjs创建弹出框实现拖动效果
2020/08/25 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
HTML的select控件美化
2017/03/27 Javascript
JS实现队列的先进先出功能示例
2017/05/10 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
2017/07/31 Javascript
webpack实用小功能介绍
2018/01/02 Javascript
从parcel.js打包出错到选择nvm的全部过程
2018/01/23 Javascript
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
快速解决bootstrap下拉菜单无法隐藏的问题
2018/08/10 Javascript
jQuery实现tab栏切换效果
2020/12/22 jQuery
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
2021/01/13 Vue.js
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
Python中利用sorted()函数排序的简单教程
2015/04/27 Python
详解Python的Django框架中的通用视图
2015/05/04 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
2020/02/25 Python
Pycharm自带Git实现版本管理的方法步骤
2020/09/18 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
2021/03/04 Python
css3弹性盒子flex实现三栏布局的实现
2020/11/12 HTML / CSS
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
2013/07/19 HTML / CSS
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
北欧最好的童装网上商店:Babyshop
2019/09/15 全球购物
2014年变电站工作总结
2014/12/19 职场文书
电影雨中的树观后感
2015/06/15 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
Windows server 2012 NTP时间同步的实现
2022/06/25 Servers