该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程

所有转载本文者,需在顶部显著位置注明原作者及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模型层之字段查询参数及聚合函数的更多相关文章

  1. django字段查询参数及聚合函数

    字段查询是指如何指定SQL WHERE子句的内容.它们用作QuerySet的filter(), exclude()和get()方法的关键字参数. 默认查找类型为exact. 下表列出了所有的字段查询参 ...

  2. 03 Django模型层: 常用(非常用)字段和参数

    Django模型层: 常用(非常用)字段和参数 1 ORM字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为i ...

  3. {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询

    Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...

  4. 第五章、Django之模型层----多表查询

    目录 第五章.Django之模型层----多表查询 一.一对多字段增删改查 1.增 2.查 3.改 4. 删除 二.多对多的增删改查 1. 增 2. 改 3. 删 三.ORM跨表查询 四.正反向的概念 ...

  5. django 模型层(2)

    Django 模型层(2) 多表操作---模型之间的关系 1 一对一:作者----作者详细信息 2 一对多:书籍----出版社 3 多对多:书籍----作者 一  创建模型(主键(id)自动创建) 没 ...

  6. Django模型层(2)

    <!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8&quo ...

  7. Django模型层之ORM

    Django模型层之ORM操作 一 ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数据库管理软 ...

  8. Django模型层之单表操作

    Django模型层之单表操作 一 .ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数据库管理软 ...

  9. Django模型层之更多操作

    Django模型层之更多操作 一 .ORM字段 1.1 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为 ...

随机推荐

  1. HTML5 Web Storage 特性

    原文地址: Using HTML5 Web Storage 原文日期: 2010年06月28日 翻译日期: 2013年08月12日 当下Web开发领域最火爆的词语当属 HTML5.HTML5标准的新特 ...

  2. linux的date的几个例子

    shell脚本为test.sh: input=$1 echo "sdfa:${input}" echo ${input} echo "dfadf"${input ...

  3. GDAL中MEM格式的简单使用示例

    GDAL库中提供了一种内存文件格式--MEM.如何使用MEM文件格式,主要有两种,一种是通过别的文件使用CreateCopy方法来创建一个MEM:另外一种是图像数据都已经存储在内存中了,然后使用内存数 ...

  4. Leetcode_26_Remove Duplicates from Sorted Array

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41558551 Remove Duplicates from ...

  5. NSString/NSMutable字符串——韩俊强…

    1.OC基本数据类型(简单铺垫) //   NSInteger  在64 位下相当于long,在非64位下相当于 int: //    CGFloat 在64位下相当于double  在非64位下相当 ...

  6. Android必知必会--NinePatch图片制作

    本文为CSDN学院免费课程<NinePatch图片制作从入门到精通>的笔记,建议新手先观看视频,整理此笔记是为了便于自己复习,有NinePatch基础的朋友可以直接观看第四部分.--[转载 ...

  7. MySQL学习笔记_4_MySQL创建数据表(下)

    MySQL创建数据表(下) 五.数据表类型及存储位置 1.MySQL与大多数数据库不同,MySQL有一个存储引擎概念.MySQL可以针对不同的存储需求选择不同的存储引擎. 2. showengines ...

  8. 你可能不知道的5种 CSS 和 JS 的交互方式

    翻译人员: 铁锚 翻译日期: 2014年01月22日 原文日期: 2014年01月20日 原文链接:  5 Ways that CSS and JavaScript Interact That You ...

  9. MySQL正则表达式初步

    如果想要了解完整的MySQL手册, 请访问: MySQL 5.1参考手册 你还可以学习: MySQL学习精粹 我们知道,在SQL之中,可以用 like 这个谓词(表达式) 来进行模糊检索,并支持 %, ...

  10. android ViewPager+Fragment之懒加载

    说说写这篇博客的背景吧,前两天去面试,问到一个问题说的是:比如我们首页,是有3个fragment构成的,并且要是实现作用可以滑,那么这个最好的选择就是ViewPager+fragment了,但是我们知 ...