Django 笔记十四之统计总数、最新纪录和空值判断等功能
本文首发于微信公众号:Hunter 后端
本篇笔记将介绍一些 Django 查询中统计总数、最新纪录和空值判断等功能。
count
in_bulk
latest、earliest
first、last
exists
contains、icontains
gt、gte、lt、lte
startswith、istartswith
isnull
1、count
返回查询的 QuerySet 的总数。
比如想查询 Blog 下 name = 'hunter' 的总数:
返回的结果直接是一个整数,类似的 SQL 代码如下:
2、in_bluk
返回一个 dict,key 为我们指定的字段名的值,value 为这个字段名所在 object 数据。
比如我们需要查询 Blog 这个 model 下 name 为 "hunter", "jack" 的数据,可以如下实现:
返回的数据如下:
但是需要注意,field_name 这个字段必须有唯一键的约束,即:
不指定 field_name 如果不指定 field_name 的值的话,那么则会默认第一个参数列表的 value 值为 id:
不传参数
如果函数里不传参数,则默认以 field_name="id" 返回所有数据:
参数为空
如果函数里的参数为空,则返回空:
3、latest、earliest
latest() 和 earliest() 一样,都是按照指定字段排序后返回最新的,或者最早的一条数据,返回的是 model 的一个实例。
前面介绍在 model 的 Meta 里如果给 get_latest_by 指定了字段,那么 latest() 就可以不加参数,默认按照 get_latest_by 的参数进行排序获取数据。
否则必须在 latest() 里指定字段。
用法如下:
系统会按照 pub_date 字段进行排序,然后返回最近的一条数据。
注意:这个操作和 get() 方法一样,如果表里不存在数据,使用 latest() 函数就会报错。
处理 null 值不同的数据库对 null 值的处理是不一样的,mysql 对 null 的排序会比非 null 值更高,
所以,在 mysql 中如果想排除掉 null 值,可以在 filter() 中去除这些数据:
latest() 是返回最新的一条数据
earliest() 则是返回最旧的一条数据。
4、first、last
返回符合条件的第一条数据:
也可以加上 filter 和 排序条件:
注意: 如果没有符合条件的数据,返回的结果可能是 None
last() 则是返回最后一条数据。
5、exists
检测数据是否存在,返回布尔型结果。
判断某种条件的数据是否存在,可以使用这种方式查询。
查询的结果可以有多个,只要结果数 >= 1,返回即为 True。
6、contains、icontains
contains 意思为包含指定字符串,用法如下:
对应的 SQL 为:
因为 MySQL 中的 like 是忽略大小写的,所以通过 like binary 来强制不忽略大小写。
而 icontains 的含义和 contains 一致,不过是忽略大小写的:
上面的语句中,name 字段内容包含 Hunter、HUNTER、hUnTER 等任何中的都可以被匹配上,对应的 SQL 为:
7、gt、gte、lt、lte
gt: greater than,大于 gte: greater than or equal to 大于等于 lt: less than 小于 lte: less than or equal to 小于等于
用法示例如下:
对应的 SQL 为:
8、startswith、istartswith
startswith 以指定字符串为开头,跟 python 里的用法类似
python 用法:
返回的 is_right 是一个 布尔型数据,表示是否以什么为开头。
Django 里的用法是:
返回一个 QuerySet,对应的 SQL 是:
startswith 是区分大小写的,istartswith 则是忽略大小写的用法
9、isnull
判断字段值是否为 null。
比如我们要取出 Enyry 表里所有 pub_date 字段为 null 的数据:
如果是取出所有字段值不为空的数据:
以上就是本篇笔记全部内容,下一篇笔记将介绍 model 查询的范围和日期的筛选功能。
版权声明: 本文为 InfoQ 作者【Hunter熊】的原创文章。
原文链接:【http://xie.infoq.cn/article/01e0ee0489a9b0722c62a56ff】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论