Django模型层之字段查询参数及聚合函数
该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程
所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址。
字段查询是指如何指定SQL WHERE子句的内容。它们用作QuerySet的filter(), exclude()和get()方法的关键字参数。
默认查找类型为exact。
下表列出了所有的字段查询参数:
| 字段名 | 说明 |
|---|---|
| exact | 精确匹配 |
| iexact | 不区分大小写的精确匹配 |
| contains | 包含匹配 |
| icontains | 不区分大小写的包含匹配 |
| in | 在..之内的匹配 |
| gt | 大于 |
| gte | 大于等于 |
| lt | 小于 |
| lte | 小于等于 |
| startswith | 从开头匹配 |
| istartswith | 不区分大小写从开头匹配 |
| endswith | 从结尾处匹配 |
| iendswith | 不区分大小写从结尾处匹配 |
| range | 范围匹配 |
| date | 日期匹配 |
| year | 年份 |
| month | 月份 |
| day | 日期 |
| week | 第几周 |
| week_day | 周几 |
| time | 时间 |
| hour | 小时 |
| minute | 分钟 |
| second | 秒 |
| isnull | 判断是否为空 |
| search | 1.10中被废弃 |
| regex | 区分大小写的正则匹配 |
| iregex | 不区分大小写的正则匹配 |
1. exact
精确匹配。 默认的查找类型!
Entry.objects.get(id__exact=14)
Entry.objects.get(id__exact=None)
2. iexact
不区分大小写的精确匹配。
Blog.objects.get(name__iexact='beatles blog')
Blog.objects.get(name__iexact=None)
第一个查询将匹配 'Beatles Blog', 'beatles blog', 'BeAtLes BLoG'等等。
3. contains
大小写敏感的包含关系匹配。
Entry.objects.get(headline__contains='Lennon')
这将匹配标题'Lennon honored today',但不匹配'lennon honored today'。
4. icontains
不区分大小写的包含关系匹配。
Entry.objects.get(headline__icontains='Lennon')
5. in
在给定的列表里查找。
Entry.objects.filter(id__in=[1, 3, 4])
还可以使用动态查询集,而不是提供文字值列表:
inner_qs = Blog.objects.filter(name__contains='Cheddar')
entries = Entry.objects.filter(blog__in=inner_qs)
或者从values()或values_list()中获取的QuerySet作为比对的对象:
inner_qs = Blog.objects.filter(name__contains='Ch').values('name')
entries = Entry.objects.filter(blog__name__in=inner_qs)
下面的例子将产生一个异常,因为试图提取两个字段的值,但是查询语句只需要一个字段的值:
# 错误的实例,将弹出异常。
inner_qs = Blog.objects.filter(name__contains='Ch').values('name', 'id')
entries = Entry.objects.filter(blog__name__in=inner_qs)
6. gt
大于
Entry.objects.filter(id__gt=4)
7. gte
大于或等于
8. lt
小于
9. lte
小于或等于
10. startswith
区分大小写,从开始位置匹配。
Entry.objects.filter(headline__startswith='Lennon')
11. istartswith
不区分大小写,从开始位置匹配。
Entry.objects.filter(headline__istartswith='Lennon')
12. endswith
区分大小写,从结束未知开始匹配。
Entry.objects.filter(headline__endswith='Lennon')
13. iendswith
不区分大小写,从结束未知开始匹配。
Entry.objects.filter(headline__iendswith='Lennon')
14. range
范围测试(包含于之中)。
import datetime
start_date = datetime.date(2005, 1, 1)
end_date = datetime.date(2005, 3, 31)
Entry.objects.filter(pub_date__range=(start_date, end_date))
警告:过滤具有日期的DateTimeField不会包含最后一天,因为边界被解释为“给定日期的0am”。
15. date
进行日期对比。
Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))
当USE_TZ为True时,字段将转换为当前时区,然后进行过滤。
16. year
对年份进行匹配。
Entry.objects.filter(pub_date__year=2005)
Entry.objects.filter(pub_date__year__gte=2005)
当USE_TZ为True时,在过滤之前,datetime字段将转换为当前时区。
17. month
对月份进行匹配。取整数1(1月)至12(12月)。
Entry.objects.filter(pub_date__month=12)
Entry.objects.filter(pub_date__month__gte=6)
当USE_TZ为True时,在过滤之前,datetime字段将转换为当前时区。
18. day
对具体到某一天的匹配。
Entry.objects.filter(pub_date__day=3)
Entry.objects.filter(pub_date__day__gte=3)
当USE_TZ为True时,在过滤之前,datetime字段将转换为当前时区。
19. week
Django1.11中的新功能。根据ISO-8601返回周号(1-52或53),即星期一开始的星期,星期四或之前的第一周。
Entry.objects.filter(pub_date__week=52)
Entry.objects.filter(pub_date__week__gte=32, pub_date__week__lte=38)
当USE_TZ为True时,字段将转换为当前时区,然后进行过滤。
20. week_day
进行“星期几”匹配。 取整数值,星期日为1,星期一为2,星期六为7。
Entry.objects.filter(pub_date__week_day=2)
Entry.objects.filter(pub_date__week_day__gte=2)
当USE_TZ为True时,在过滤之前,datetime字段将转换为当前时区。
21. time
Django1.11中的新功能。
将字段的值转为datetime.time格式并进行对比。
Entry.objects.filter(pub_date__time=datetime.time(14, 30))
Entry.objects.filter(pub_date__time__between=(datetime.time(8), datetime.time(17)))
USE_TZ为True时,字段将转换为当前时区,然后进行过滤。
22. hour
对小时进行匹配。 取0和23之间的整数。
Event.objects.filter(timestamp__hour=23)
Event.objects.filter(time__hour=5)
Event.objects.filter(timestamp__hour__gte=12)
当USE_TZ为True时,值将过滤前转换为当前时区。
23. minute
对分钟匹配。取0和59之间的整数。
Event.objects.filter(timestamp__minute=29)
Event.objects.filter(time__minute=46)
Event.objects.filter(timestamp__minute__gte=29)
当USE_TZ为True时,值将被过滤前转换为当前时区。
24. second
对秒数进行匹配。取0和59之间的整数。
Event.objects.filter(timestamp__second=31)
Event.objects.filter(time__second=2)
Event.objects.filter(timestamp__second__gte=31)
当USE_TZ为True时,值将过滤前转换为当前时区。
25. isnull
值为False或True, 相当于SQL语句IS NULL和IS NOT NULL.
Entry.objects.filter(pub_date__isnull=True)
26. search
自1.10版以来已弃用。
27. regex
区分大小写的正则表达式匹配。
Entry.objects.get(title__regex=r'^(An?|The) +')
建议使用原始字符串(例如,r'foo'而不是'foo')来传递正则表达式语法。
28. iregex
不区分大小写的正则表达式匹配。
Entry.objects.get(title__iregex=r'^(an?|the) +')
聚合函数
Django的django.db.models模块提供以下聚合函数。
1. expression
引用模型字段的一个字符串,或者一个query expression。
2. output_field
用来表示返回值的model field,一个可选的参数。
3. **extra
关键字参数可以给聚合函数生成的SQL提供额外的信息。
4. Avg
class Avg(expression, output_field=FloatField(), **extra)[source]
返回给定表达式的平均值,它必须是数值,除非指定不同的output_field。
默认的别名:<field>__avg
返回类型:float(或指定任何output_field的类型)
5. Count
class Count(expression, distinct=False, **extra)[source]
返回与expression相关的对象的个数。
默认的别名:<field>__count
返回类型:int
有一个可选的参数:distinct。如果distinct=True,Count 将只计算唯一的实例。默认值为False。
6. Max
class Max(expression, output_field=None, **extra)[source]
返回expression的最大值。
默认的别名:<field>__max
返回类型:与输入字段的类型相同,如果提供则为`output_field`类型
7. Min
class Min(expression, output_field=None, **extra)[source]
返回expression的最小值。
默认的别名:<field>__min
返回类型:与输入字段的类型相同,如果提供则为`output_field`类型
8. StdDev
class StdDev(expression, sample=False, **extra)[source]
返回expression的标准差。
默认的别名:<field>__stddev
返回类型:float
有一个可选的参数:sample。默认情况下,返回群体的标准差。如果sample=True,返回样本的标准差。
SQLite 没有直接提供StdDev。
9. Sum
class Sum(expression, output_field=None, **extra)[source]
计算expression的所有值的和。
默认的别名:<field>__sum
返回类型:与输入字段的类型相同,如果提供则为output_field类型
10. Variance
class Variance(expression, sample=False, **extra)[source]
返回expression的方差。
默认的别名:<field>__variance
返回类型:float
有一个可选的参数:sample。
SQLite 没有直接提供Variance。
Django模型层之字段查询参数及聚合函数的更多相关文章
- django字段查询参数及聚合函数
字段查询是指如何指定SQL WHERE子句的内容.它们用作QuerySet的filter(), exclude()和get()方法的关键字参数. 默认查找类型为exact. 下表列出了所有的字段查询参 ...
- 03 Django模型层: 常用(非常用)字段和参数
Django模型层: 常用(非常用)字段和参数 1 ORM字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为i ...
- {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...
- 第五章、Django之模型层----多表查询
目录 第五章.Django之模型层----多表查询 一.一对多字段增删改查 1.增 2.查 3.改 4. 删除 二.多对多的增删改查 1. 增 2. 改 3. 删 三.ORM跨表查询 四.正反向的概念 ...
- django 模型层(2)
Django 模型层(2) 多表操作---模型之间的关系 1 一对一:作者----作者详细信息 2 一对多:书籍----出版社 3 多对多:书籍----作者 一 创建模型(主键(id)自动创建) 没 ...
- Django模型层(2)
<!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8&quo ...
- Django模型层之ORM
Django模型层之ORM操作 一 ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数据库管理软 ...
- Django模型层之单表操作
Django模型层之单表操作 一 .ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数据库管理软 ...
- Django模型层之更多操作
Django模型层之更多操作 一 .ORM字段 1.1 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为 ...
随机推荐
- linux下重启weblogic(关闭和启动)
ssh远程连接Linux服务器! 开启weblogic: 1.找到/Oracle/Middleware/user_projects/domains/用户_domain目录, 2.执行nohup ...
- flexbox基本原理
新版的flexbox规范分两部分:一部分是container,一部分是 items. flexbox是一整套布局规范,包含了多个css属性,所以学习起来比`float: left;` 这样简单的布局要 ...
- OJ题:字符串最后一个单词的长度
题目描述 计算字符串最后一个单词的长度,单词以空格隔开. 输入描述: 一行字符串,非空,长度小于5000. 输出描述: 整数N,最后一个单词的长度. 输入例子: hello world 输出例子: 5 ...
- Swift基础之Delegate方法的使用
本文简单介绍了使用Delegate方法的进行值的传递,改变上一个界面的字体大小和颜色 首先创建一个导航视图: let viewC = ViewController(); let navi ...
- maven中去掉单元测试的配置
如果是在命令行中去掉测试,可以在命令行中输入:mvn install -Dmaven.test.skip=true 在pom.xml <plugins> <plugin& ...
- 2016 苹果全球开发者大会(WWDC)
纵观WWDC 2016开发者大会的全部内容,尽管本次大会没有那些新的产品发布,不过能让各位果粉的肾留到秋天,那也是苹果公司对各位果粉的关爱啊.但是对iOS开发者而言,新发布的技术还是比较不错的.主要内 ...
- 大多数时候是软件的Bug,但是... 有时候的确是硬件的问题!
在我们性能最好的服务器中,有一台是从之前的64位测试项目中遗留下来的.那台机器配有皓龙250双核处理器,内存有8 GB.服役了一年之后,那种配置仍然是相当不错的.它还有贴心的升级方案可选:它的泰安Th ...
- Linux Shell 脚本攻略学习--四
linux中(chattr)创建不可修改文件的方法 在常见的linux扩展文件系统中(如ext2.ext3.ext4等),可以将文件设置为不可修改(immutable).某些文件属性可帮助我们将文件设 ...
- Android APP新的“优雅”退出方式--EventBus大显身手
最近在研究eventBus..很多小伙伴不知道他有什么用.. 前篇介绍了EventBus的基本使用 这里简单举一个例子,就是退出APP 转载请注明出处:http://blog.csdn.net/win ...
- PSAM 卡的应用 操作方法
PSAM 卡的应用 PSAM 功能 终端安全存储模块 PASM 常用于 脱机交易的 安全认证 脱机交易的流程 1.卡片对持卡人的认证(防止 ...