Django中五花八门的数据库查询

0. 前言

Django中的域查询对应于SQL查询语句中的WHERE字句。查询通常被用于filter()exclude()get()这些方法,以此来产生QuerySet对象。

1. 查询语法一览

exact

精确匹配。如果查询的值为None,则对应于SQL语言中的NULL
如果在查询过程中不指定任何查询类型,则默认为exact
示例:
Django中五花八门的数据库查询
对应于SQL语句:
Django中五花八门的数据库查询

iexact

大小写不敏感,其余与exact相同。
示例:
Django中五花八门的数据库查询
对应于SQL语句:
Django中五花八门的数据库查询

contains

大小写敏感的包含,包含指定文本。
示例:
Django中五花八门的数据库查询
对应于SQL语句:
Django中五花八门的数据库查询

icontains

大小写不敏感,其余与contains相同。
示例:
Django中五花八门的数据库查询
对应于SQL语句:
Django中五花八门的数据库查询

in

普通用法

选出在给定集合(List、Tuple、QuerySet、Str)中的记录。
示例:
Django中五花八门的数据库查询
对应于SQL语句:
Django中五花八门的数据库查询

嵌套查询

如果集合使用QuerySet,可以实现嵌套查询。
示例:
Django中五花八门的数据库查询
对应于SQL语句:
Django中五花八门的数据库查询

性能分析

对于某些数据库后端,如MySQL,并不能很好地优化嵌套查询,为了获得更好的性能,可以考虑提取出第一个查询的结果,然后传入第二个查询,即:
Django中五花八门的数据库查询
注意需要使用list(),这是为了使得第一个查询被执行,原因是QuerySet是懒惰(lazy)的!

gt、gte、lt、lte

大于、大于等于、小于、小于等于。
示例:
Django中五花八门的数据库查询
对应于SQL语句:
Django中五花八门的数据库查询

startswith

大小写敏感的startswith。
示例:
Django中五花八门的数据库查询
对应于SQL语句:
Django中五花八门的数据库查询

istartswith

大小写不敏感的startswith。

endswith

大小写敏感的endswith。

iendswith

大小写不敏感的endswith。

range

范围选择,对应于SQL中的BETWEEN。
示例:
Django中五花八门的数据库查询
对应于SQL语句:
Django中五花八门的数据库查询

时间日期类

date

对于datetime域,会被转型为date进行进一步查询。
示例:
Django中五花八门的数据库查询
不同的数据库引擎实现方式不一样,故不给出具体的SQL。

year、month、day

提取出年、月、日部分,进行判断。月份的范围是1~12。
示例:
Django中五花八门的数据库查询
对应于SQL语句:
Django中五花八门的数据库查询

week_day

选择星期几,1对应星期天,7对应星期六
示例:
Django中五花八门的数据库查询

time

将datetime域转换为time类型,可以使用datetime.time类型进行查询。
示例:
Django中五花八门的数据库查询

hour、minute、second

时分秒。

isnull

如果取值为True,对应SQL为IS NULL;
如果取值为False,对应SQL为IS NOT NULL。
示例:
Django中五花八门的数据库查询
对应于SQL语句:
Django中五花八门的数据库查询

regex

大小写敏感的正则表达式匹配。正则表达式的语法取决于对应的数据库后端。
示例:
Django中五花八门的数据库查询
对应于SQL语句:
Django中五花八门的数据库查询

iregex

大小写不敏感的正则表达式匹配。