草庐IT

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

hunterxiong 2023-04-02 原文

本篇笔记将介绍一些 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. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  2. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  3. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  4. ruby-on-rails - rails 功能测试 - 2

    在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建

  5. ruby-on-rails - 功能测试 Authlogic? - 2

    在我的一些Controller中,我有一个before_filter检查用户是否登录?用于CRUD操作。application.rbdeflogged_in?unlesscurrent_userredirect_toroot_pathendendprivatedefcurrent_user_sessionreturn@current_user_sessionifdefined?(@current_user_session)@current_user_session=UserSession.findenddefcurrent_userreturn@current_userifdefine

  6. 机器学习——时间序列ARIMA模型(四):自相关函数ACF和偏自相关函数PACF用于判断ARIMA模型中p、q参数取值 - 2

    文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk​=Var(yt​)Cov(yt​,yt−k​)​其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞

  7. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  8. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  9. 最新版人脸识别小程序 图片识别 生成二维码签到 地图上选点进行位置签到 计算签到距离 课程会议活动打卡日常考勤 上课签到打卡考勤口令签到 - 2

    技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进

  10. 如何判断oracle是否启动及启动oracle数据库 - 2

    plsql连接Oracle超时,完犊子了肯定是服务器断电了。得马上检查Oracle服务器状态1、检查数据库是否启动su-oracle切换到Oracle用户,输入sqlplus/assysdba显示连接状态。如果末尾显示的状态是Connectedtoanidleinstance.证明未启动2、启动数据库startup启动数据库,末尾出现Databaseopened说明数据库启动成功3、查看数据库监听是否正常先quit;断开Oracle连接,使用lsnrctlstatus查看监听状态,如果出现TNS-开头的Nolistener、Connectionrefused等错误,说明监听未启动4、启动数据库

随机推荐