共计 2869 个字符,预计需要花费 8 分钟才能阅读完成。
本篇笔记将介绍一些 Django 查问中统计总数、最新纪录和空值判断等性能。
- count
- in_bulk
- latest、earliest
- first、last
- exists
- contains、icontains
- gt、gte、lt、lte
- startswith、istartswith
- 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 查问的范畴和日期的筛选性能。
本文首发于自己微信公众号:Django 笔记。
原文链接:Django 笔记十四之统计总数、最新纪录和空值判断等性能
如果想获取更多相干文章,可扫码关注浏览: