• 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': object (1)>, 'jack': 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: object (1)>, 2: 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笔记十四之统计总数、最新纪录和空值判断等功能

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

  • 相关阅读:
    主语补足语SC【语法笔记】
    springboot时间管理系统springboot47
    HashSet编程小案例,控制生日和姓名。重写HashCode
    人红细胞膜带3蛋白修饰重组人脂质体/融合蛋白的细胞膜脂质gpi-ny-eso-1研究
    外贸怎么在谷歌搜索客户?
    金仓数据库 KingbaseGIS 使用手册(6.18. 线性参考函数)
    函数指针一站式理解(C++ primer plus),包括指针数组,数组指针,胆小慎入
    mac 安装使用svn教程
    NodeJS校园快递智能互助平台-计算机毕业设计源码58554
    RBAC权限设计
  • 原文地址:https://www.cnblogs.com/hunterxiong/p/17281528.html