文章目录
0. 前言
Django中的域查询对应于SQL查询语句中的WHERE字句。查询通常被用于filter()、exclude()、get()这些方法,以此来产生QuerySet对象。
1. 查询语法一览
exact
精确匹配。如果查询的值为None,则对应于SQL语言中的NULL。
如果在查询过程中不指定任何查询类型,则默认为exact。
示例:
对应于SQL语句:
iexact
大小写不敏感,其余与exact相同。
示例:
对应于SQL语句:
contains
大小写敏感的包含,包含指定文本。
示例:
对应于SQL语句:
icontains
大小写不敏感,其余与contains相同。
示例:
对应于SQL语句:
in
普通用法
选出在给定集合(List、Tuple、QuerySet、Str)中的记录。
示例:
对应于SQL语句:
嵌套查询
如果集合使用QuerySet,可以实现嵌套查询。
示例:
对应于SQL语句:
性能分析
对于某些数据库后端,如MySQL,并不能很好地优化嵌套查询,为了获得更好的性能,可以考虑提取出第一个查询的结果,然后传入第二个查询,即:
注意需要使用list(),这是为了使得第一个查询被执行,原因是QuerySet是懒惰(lazy)的!
gt、gte、lt、lte
大于、大于等于、小于、小于等于。
示例:
对应于SQL语句:
startswith
大小写敏感的startswith。
示例:
对应于SQL语句:
istartswith
大小写不敏感的startswith。
endswith
大小写敏感的endswith。
iendswith
大小写不敏感的endswith。
range
范围选择,对应于SQL中的BETWEEN。
示例:
对应于SQL语句:
时间日期类
date
对于datetime域,会被转型为date进行进一步查询。
示例:
不同的数据库引擎实现方式不一样,故不给出具体的SQL。
year、month、day
提取出年、月、日部分,进行判断。月份的范围是1~12。
示例:
对应于SQL语句:
week_day
选择星期几,1对应星期天,7对应星期六。
示例:
time
将datetime域转换为time类型,可以使用datetime.time类型进行查询。
示例:
hour、minute、second
时分秒。
isnull
如果取值为True,对应SQL为IS NULL;
如果取值为False,对应SQL为IS NOT NULL。
示例:
对应于SQL语句:
regex
大小写敏感的正则表达式匹配。正则表达式的语法取决于对应的数据库后端。
示例:
对应于SQL语句:
iregex
大小写不敏感的正则表达式匹配。