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实现向QQ群成员自动发邮件的方法
Nov 19 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
Jul 25 Python
pycharm的console输入实现换行的方法
Jan 16 Python
Python2 Selenium元素定位的实现(8种)
Feb 25 Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 Python
Python 音频生成器的实现示例
Dec 24 Python
python求numpy中array按列非零元素的平均值案例
Jun 08 Python
Python持续监听文件变化代码实例
Jul 22 Python
详解python字符串驻留技术
May 21 Python
Python爬取英雄联盟MSI直播间弹幕并生成词云图
Jun 01 Python
Python日志模块logging用法
Jun 05 Python
python 使用pandas读取csv文件的方法
Dec 24 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反射应用示例
2014/02/25 PHP
php socket客户端及服务器端应用实例
2014/07/04 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
thinkPHP线上自动加载异常与修复方法实例分析
2016/12/01 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
JavaScript中setInterval的用法总结
2013/11/20 Javascript
js实现正方形颜色从下往上升的效果
2014/08/04 Javascript
js实现select组件的选择输入过滤代码
2014/10/14 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
深入理解angular2启动项目步骤
2017/07/15 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
解决vue cli使用typescript后打包巨慢的问题
2019/09/30 Javascript
微信小程序点击item使之滚动到屏幕中间位置
2020/03/25 Javascript
JS实现鼠标按下拖拽效果
2020/07/23 Javascript
[01:20]DOTA2 齐天大圣至宝动态展示
2016/12/13 DOTA
[01:03:51]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第三场
2018/04/09 DOTA
在Python中处理时间之clock()方法的使用
2015/05/22 Python
浅谈Python基础之I/O模型
2017/05/11 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
Python爬虫框架Scrapy实例代码
2018/03/04 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
Python基础知识点 初识Python.md
2019/05/14 Python
Python实现把多维数组展开成DataFrame
2019/11/30 Python
Python hashlib常见摘要算法详解
2020/01/13 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
美国高端婴童品牌:Hanna Andersson
2016/10/30 全球购物
英国户外装备商店:Ultimate Outdoors
2019/05/07 全球购物
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
会计系个人求职信范文分享
2013/12/20 职场文书
餐饮业员工工作决心书
2014/03/11 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
优质服务口号
2014/06/11 职场文书
公司委托书范本5篇
2014/09/20 职场文书
电工实训心得体会
2016/01/14 职场文书
python3实现常见的排序算法(示例代码)
2021/07/04 Python