最近发布代码的时候,遇到一个问题,发现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() 的运用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
本文向大家介绍JavaScript的==运算详解,包括了JavaScript的==运算详解的使用技巧和注意事项,需要的朋友参考一下 大家知道,JavaScript中的==是一种比较复杂运算,它的运算规则很奇怪,很容易让人犯错,从而成为JavaScript中“最糟糕的特性”之一。 在仔细阅读ECMAScript规范的基础上,我画了一张图,我想等你理解了这张图后,会彻底地弄懂关于==运算的一切。同时,
本文向大家介绍详解C++中new运算符和delete运算符的使用,包括了详解C++中new运算符和delete运算符的使用的使用技巧和注意事项,需要的朋友参考一下 C++ 支持使用 new 和 delete 运算符动态分配和释放对象。这些运算符为来自称为“自由存储”的池中的对象分配内存。 new 运算符调用特殊函数 operator new,delete 运算符调用特殊函数 operator de
本文向大家介绍详解C++编程中运算符的使用,包括了详解C++编程中运算符的使用的使用技巧和注意事项,需要的朋友参考一下 C++的运算符十分丰富,使得C++的运算十分灵活方便。例如把赋值号(=)也作为运算符处理,这样,a=b=c=4就是合法的表达式,这是与其他语言不同的。C++提供了以下运算符: 算术运算符 +(加) -(减) *(乘) /(除) %(整除求余) ++(自加) --(自减
本文向大家介绍javascript运动详解,包括了javascript运动详解的使用技巧和注意事项,需要的朋友参考一下 物体运动原理:通过改变物体的位置,而发生移动变化。 方法: 1.运动的物体使用绝对定位 2.通过改变定位物体的属性(left、right、top、bottom)值来使物体移动。例如向右或左移动可以使用offsetLeft(offsetRight)来控制左右移动。 步骤: 1、开始
本文向大家介绍Python运维开发之psutil库的使用详解,包括了Python运维开发之psutil库的使用详解的使用技巧和注意事项,需要的朋友参考一下 介绍 psutil能够轻松实现获取系统运行的进程和系统利用率。 导入模块 获取系统性能信息 CPU信息 使用cpu_times()方法获取CPU的完整信息: 获取单项数据,例如用户user的CPU时间比: 获取CPU的个数: 内存信息 获取物理
本文向大家介绍微信jssdk逻辑在vue中的运用详解,包括了微信jssdk逻辑在vue中的运用详解的使用技巧和注意事项,需要的朋友参考一下 微信 jssdk 在 vue 中的简单使用 以上是微信官方给出的示例代码,但是对于实际项目使用,还需要进一步对代码进行封装。本文基于 vue 进行示范,其余类框架同理。 在微信公众平台的官方文档中已经指出,由于安全性考虑,需要将签名逻辑放在后端处理,所以签名原