头图

Django笔记十四之统计总数、最新纪录和空值判断等功能

本文首发于微信公众号:Hunter后端。

原文链接:Django笔记十四之统计总数、最新纪录和空值判断等功能

本篇笔记将介绍一些 Django 查询中统计总数、最新纪录和空值判断等功能。

  1. count
  2. in_bulk
  3. latest、earliest
  4. first、last
  5. exists
  6. contains、icontains
  7. gt、gte、lt、lte
  8. startswith、istartswith
  9. isnull

1、count

返回查询的 QuerySet 的总数。

比如想查询 Blog 下 name = 'hunter' 的总数:

Blog.objects.filter(name="hunter").count()

返回的结果直接是一个整数,类似的 SQL 代码如下:

select count(*) from blog_blog where name = 'hunter';

2、in_bluk

返回一个 dict,key 为我们指定的字段名的值,value 为这个字段名所在 object 数据。

比如我们需要查询 Blog 这个 model 下 name 为 "hunter", "jack" 的数据,可以如下实现:

Blog.objects.in_bulk(["hunter", "jack"], field_name="name")

返回的数据如下:

{'hunter': <Blog: Blog object (1)>, 'jack': <Blog: Blog object (2)>}

但是需要注意,field_name 这个字段必须有唯一键的约束,即:

class Blog(models.Model):
    name = models.CharField(max_length=100, unique=True)
    tagline = models.TextField()

不指定 field_name
如果不指定 field_name 的值的话,那么则会默认第一个参数列表的 value 值为 id:

Blog.objects.in_bulk([1, 2])

{1: <Blog: Blog object (1)>, 2: <Blog: Blog object (2)>}

不传参数

如果函数里不传参数,则默认以 field_name="id" 返回所有数据:

Blog.objects.in_bulk()

参数为空

如果函数里的参数为空,则返回空:

Blog.objects.in_bulk([])

3、latest、earliest

latest() 和 earliest() 一样,都是按照指定字段排序后返回最新的,或者最早的一条数据,返回的是 model 的一个实例。

前面介绍在 model 的 Meta 里如果给 get_latest_by 指定了字段,那么 latest() 就可以不加参数,默认按照 get_latest_by 的参数进行排序获取数据。

否则必须在 latest() 里指定字段。

用法如下:

entry_obj = Entry.objects.latest('pub_date)

entry_obj = Entry.objects.latest('pub_date', '-expire_date')

系统会按照 pub_date 字段进行排序,然后返回最近的一条数据。

注意:这个操作和 get() 方法一样,如果表里不存在数据,使用 latest() 函数就会报错。

处理 null 值
不同的数据库对 null 值的处理是不一样的,mysql 对 null 的排序会比非null值更高,

所以,在 mysql 中如果想排除掉 null 值,可以在 filter() 中去除这些数据:

Entry.objects.filter(pub_date__isnull=False).latest('pub_date')

latest() 是返回最新的一条数据

earliest() 则是返回最旧的一条数据。

4、first、last

返回符合条件的第一条数据:

Entry.objects.first()

也可以加上filter 和 排序条件:

entry = Entry.objects.filter(id__gte=12).order_by("pub_date").first()

注意: 如果没有符合条件的数据,返回的结果可能是 None

last() 则是返回最后一条数据。

5、exists

检测数据是否存在,返回布尔型结果。


is_exist = Blog.objects.filter(id=1).exists()

判断某种条件的数据是否存在,可以使用这种方式查询。

查询的结果可以有多个,只要结果数 >= 1,返回即为 True。

6、contains、icontains

contains 意思为包含指定字符串,用法如下:

Blog.objects.filter(name__contains="hunter")

对应的 SQL 为:

select * from blog_blog where name like binary '%hunter%'

因为 MySQL 中的 like 是忽略大小写的,所以通过 like binary 来强制不忽略大小写。

而 icontains 的含义和 contains 一致,不过是忽略大小写的:

Blog.objects.filter(name__icontains="hunter")

上面的语句中,name 字段内容包含 Hunter、HUNTER、hUnTER 等任何中的都可以被匹配上,
对应的 SQL 为:

select * from blog_blog where name like '%hunter%'

7、gt、gte、lt、lte

gt: greater than,大于
gte: greater than or equal to 大于等于
lt: less than 小于
lte: less than or equal to 小于等于

用法示例如下:

Blog.objects.filter(id__gt=12)

对应的 SQL 为:

select * from blog_blog where id > 12

8、startswith、istartswith

startswith 以指定字符串为开头,跟 python 里的用法类似

python 用法:

is_right = "abc".startswth("ab")

返回的 is_right 是一个 布尔型数据,表示是否以什么为开头。

Django 里的用法是:

Blog.objects.filter(name__startswith="hunter")

返回一个 QuerySet,对应的 SQL 是:

select * from blog_blog where name like binary 'hunter%'

startswith 是区分大小写的,istartswith 则是忽略大小写的用法

9、isnull

判断字段值是否为 null。

比如我们要取出 Enyry 表里所有 pub_date 字段为 null 的数据:

Entry.objects.filter(pub_date__isnull=True)

如果是取出所有字段值不为空的数据:

Entry.objects.filter(pub_date__isnull=False)

以上就是本篇笔记全部内容,下一篇笔记将介绍model 查询的范围和日期的筛选功能。

如果想获取更多相关文章,可扫码关注阅读:
image.png


7 声望
5 粉丝
0 条评论
推荐阅读
MySQL笔记十三之时间格式化date_format
本文首发于公众号:Hunter后端原文链接:MySQL笔记十三之时间格式化date_format这一篇笔记介绍如何对 MySQL 中的时间字段进行格式化处理。根据前一篇笔记的内容,现在我们对 book 表添加一个时间字段,created_ti...

Hunter

封面图
花了几个月时间把 MySQL 重新巩固了一遍,梳理了一篇几万字 “超硬核” 的保姆式学习教程!(持续更新中~)
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

民工哥14阅读 1.9k

封面图
基于Sanic的微服务基础架构
使用python做web开发面临的一个最大的问题就是性能,在解决C10K问题上显的有点吃力。有些异步框架Tornado、Twisted、Gevent 等就是为了解决性能问题。这些框架在性能上有些提升,但是也出现了各种古怪的问题难以...

jysong6阅读 3.9k评论 3

初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。

王中阳Go4阅读 1.7k评论 2

封面图
滚蛋吧,正则表达式!
你是不是也有这样的操作,比如你需要使用「电子邮箱正则表达式」,首先想到的就是直接百度上搜索一个,然后采用 CV 大法神奇地接入到你的代码中?

良许4阅读 2.3k

又一款眼前一亮的Linux终端工具!
今天给大家介绍一款最近发现的功能十分强大,颜值非常高的一款终端工具。这个神器我是在其他公众号文章上看到的,但他们都没把它的强大之处介绍明白,所以我自己体验一波后,再向大家分享自己的体验。

良许5阅读 1.8k

FastAPI性能碾压Flask?
不止一次的听过,FastAPI性能碾压Flask,直追Golang,不过一直没有测试过,今天闲着没事测试一下看看结果。不知道是哪里出了问题,结果大跌眼镜。

二毛erma02阅读 10.2k评论 3

封面图
7 声望
5 粉丝
宣传栏