本篇笔记将介绍一些 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 查询的范围和日期的筛选功能。

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

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

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

Django笔记十四之统计总数、最新纪录和空值判断等功能的更多相关文章

  1. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  2. 《C++游戏开发》笔记十四 平滑过渡的战争迷雾(二) 实现:真正的迷雾来了

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9712321 作者:七十一雾央 新浪微博:http:/ ...

  3. (C/C++学习笔记) 十四. 动态分配

    十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...

  4. TCP/IP详解 笔记十四

    TCP/IP协议(二)  连接的建立与终止 tcpdump -S输出TCP报文的格式 格式: 源>目的:标志 (标志就是tcp头部).标识首字符意义如下: 例如:telnet 某服务的输出(包括 ...

  5. MYSQL进阶学习笔记十四:MySQL 应用程序优化!(视频序号:进阶_32)

    知识点十五:MySQL 的应用程序优化(32) 一.访问数据库采用连接池 把连接当做对象或设备,统一放在‘连接池’里.凡是需要访问数据库的地方都从连接池里取连接 二.采用缓存减少对于MySQL的访问: ...

  6. SharpGL学习笔记(十四) 材质:十二个材质球

    材质颜色 OpenGL用材料对光的红.绿.蓝三原色的反射率来近似定义材料的颜色.象光源一样,材料颜色也分成环境.漫反射和镜面反射成分,它们决定了材料对环境光.漫反射光和镜面反射光的反射程度.在进行光照 ...

  7. 【转】angular学习笔记(十四)-$watch(1)

    本篇主要介绍$watch的基本概念: $watch是所有控制器的$scope中内置的方法: $scope.$watch(watchObj,watchCallback,ifDeep) watchObj: ...

  8. How tomcat works 读书笔记十四 服务器组件和服务组件

    之前的项目还是有些问题的,例如 1 只能有一个连接器,只能处理http请求,无法添加另外一个连接器用来处理https. 2 对容器的关闭只能是粗暴的关闭Bootstrap. 服务器组件 org.apa ...

  9. Django(十四)分页器(paginator)及自定义分页D

    http://www.mamicode.com/info-detail-1724597.html http://www.cnblogs.com/wupeiqi/articles/5246483.htm ...

  10. SpringBoot笔记十四:消息队列

    目录 什么是消息队列 消息队列的作用 异步通信 应用解耦 流量削峰 RabbitMQ RabbitMQ流程简介 RabbitMQ的三种模式 安装RabbitMQ RabbitMQ交换器路由和队列的创建 ...

随机推荐

  1. AVD文件转移到非系统盘

    AVD文件默认是生成在C:\Users\用户名\.android\avd目录下面的,而AVD文件非常大,可以用下面的方法将AVD文件转移到其他盘中. 1. 将每个模拟器对应的***.avd文件夹的内容 ...

  2. mysql锁表原因及解决方法

    mysql锁表原因及解决方法   一.导致锁表的原因 1.锁表发生在insert update .delete 中: 2.锁表的原理是 数据库使用独占式封锁机制,当执行上面的语句时,对表进行锁住,直到 ...

  3. Array of products

    refer to: https://www.algoexpert.io/questions/Array%20Of%20Products Problem Statement Sample input A ...

  4. MLP-Mixer: An all-MLP Architecture for Vision 纯MLP架构

    典型的MLP结构包括三层:input.hidden.output.不同层之间都是全联接的. MLP-Mixer完全利用基础的矩阵乘法运算和数据变换以及非线性层来完成复杂数据集的分类任务. Step 1 ...

  5. curl 查看响应时间

    curl -o /dev/null -s -w "time_namelookup:%{time_namelookup}\ntime_connect: %{time_connect}\ntim ...

  6. docker知识篇

    什么是Docker?Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).b ...

  7. ABAP开发面向对象---类

    今日学习ABAP面向对象里面的类,关于构造,继承,实现. 踩坑点:类有抽象的方法,类本身也需要是抽象的,故需要在类申明里面加上ABSTRACT关键字 学习资料为B站翱翔云天老师的 1 CLASS zc ...

  8. nginx日志分析--可视化

    1. 安装依赖 yum install glib2 glib2-devel GeoIP-devel ncurses-devel zlib zlib-devel -y wget https://gith ...

  9. 导入ssm项目时,项目基本的配置文件

    一.ssm框架基本的配置文件 上面的这些配置文件对于比较简单的ssm项目其实大同小异,逻辑上是差不多的. 在config目录下 在lib下就是各种jar包 二.导入ssm项目后,本地环境配置和项目本身 ...

  10. C# 根据 RichTextBox 内容 动态 重设其大小 以达到 不会 显示滚动条

    /// <summary> /// 根据内容重设大小以达到不会显示滚动条 /// 测试:正确 /// 时间:202106021957 /// </summary> public ...