1 环境
Python3.7.3
Django==2.0.7
2 Field查找
字段查找是指定SQL WHERE子句的内容的方式。它们被指定为QuerySet方法的关键字参数filter(), exclude()并且get()。
参数 说明
xxx__exact 精确等于 = like ‘aaa’
xxx__iexact 精确等于(忽略大小写) = ilike ‘aaa’
xxx__contains 包含 = like ‘%aaa%’
xxx__icontains 包含(忽略大小写) = ilike ‘%aaa%’,但是对于SQLite来说,contains的作用效果等同于icontains。
xxx__gt 大于
xxx__gte 大于等于
xxx__lt 小于
xxx__lte 小于等于
xxx__in 存在于一个list范围内
xxx__startswith 以…开头
xxx__istartswith 以…开头 忽略大小写
xxx__endswith 以…结尾
xxx__iendswith 以…结尾,忽略大小写
xxx__range 在…范围内
xxx__year 日期字段的年份
xxx__month 日期字段的月份
xxx__day 日期字段的日
exact
完全符合,如果提供用于比较的值None,则将其解释为SQL NULL。
例子:
Entry.objects.get(id__exact=14)
Entry.objects.get(id__exact=None)
SQL:
SELECT ... WHERE id = 14;
SELECT ... WHERE id IS NULL;
iexact
不区分大小写的完全匹配,如果提供用于比较的值None,则将其解释为SQL NULL。
不区分大小写的完全匹配,如果提供用于比较的值None,则将其解释为SQL NULL。
例子:
Blog.objects.get(name__iexact='beatles blog')
Blog.objects.get(name__iexact=None)
SQL:
SELECT ... WHERE name ILIKE 'beatles blog';
SELECT ... WHERE name IS NULL;
contains
区分大小写的包含。
例子:
Entry.objects.get(headline__contains='Lennon')
SQL:
SELECT ... WHERE headline LIKE '%Lennon%';
注意:
SQLite不支持区分大小写的LIKE语句; contains 就像icontainsSQLite一样。
icontains
不区分大小写的包含。
例子:
Entry.objects.get(headline__icontains='Lennon')
SQL:
SELECT ... WHERE headline ILIKE '%Lennon%';
in
在给定的可迭代中; 通常是列表,元组或查询集。
例子:
Entry.objects.filter(id__in=[1, 3, 4])
SQL:
SELECT ... WHERE id IN (1, 3, 4);
还可以使用查询集动态评估值列表,而不是提供文字值列表:
inner_qs = Blog.objects.filter(name__contains='Cheddar')
entries = Entry.objects.filter(blog__in=inner_qs)
SQL:
SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE '%Cheddar%')
gt/gte/lt/lte
例子:
Entry.objects.filter(id__gt=4)
SQL:
SELECT ... WHERE id > 4;
startswith
区分大小写的开头。
例子:
Entry.objects.filter(headline__startswith='Lennon')
SQL:
SELECT ... WHERE headline LIKE 'Lennon%';
注意:
SQLite不支持区分大小写的LIKE语句; startswith就像istartswith在SQLite中一样。
istartswith
不区分大小写的开头。
例子:
Entry.objects.filter(headline__istartswith='Lennon')
SQL:
SELECT ... WHERE headline ILIKE 'Lennon%';
endswith
区分大小写的结尾。
例子:
Entry.objects.filter(headline__endswith='Lennon')
SQL:
SELECT ... WHERE headline LIKE '%Lennon';
注意:
SQLite不支持区分大小写的LIKE语句; endswith就像iendswith在SQLite中一样。
iendswith
不区分大小写的结尾。
例子:
Entry.objects.filter(headline__iendswith='Lennon')
SQL:
SELECT ... WHERE headline ILIKE '%Lennon';
range
范围测试(包括在内)。
例子:
import datetime
start_date = datetime.date(2019, 1, 1)
end_date = datetime.date(2019, 3, 31)
Entry.objects.filter(pub_date__range=(start_date, end_date))
SQL:
SELECT ... WHERE pub_date BETWEEN '2019-01-01' and '2019-03-31';
date
对于datetime字段,将值转换为日期。允许链接其他字段查找。采用日期值。
例子:
Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))
SQL:
此查找不包含等效的SQL代码片段,因为相关查询的实现因不同的数据库引擎而异。
year/month/day/week/week_day/quarter(取1到4之间的整数值,表示一年中的四分之一。)
对于日期和日期时间字段,确切的年份匹配。允许链接其他字段查找。需要整数年。
例子:
Entry.objects.filter(pub_date__year=2005)
Entry.objects.filter(pub_date__year__gte=2005)
SQL:
SELECT ... WHERE pub_date BETWEEN '2005-01-01' AND '2005-12-31';
SELECT ... WHERE pub_date >= '2005-01-01';
time/hour/minute/second
对于datetime字段,将值转换为时间。允许链接其他字段查找。取一个datetime.time值。
例子:
Entry.objects.filter(pub_date__time=datetime.time(14, 30))
Entry.objects.filter(pub_date__time__range=(datetime.time(8), datetime.time(17)))
SQL:
此查找不包含等效的SQL代码片段,因为相关查询的实现因不同的数据库引擎而异。
1
isnull
采用任一True或False,其对应于SQL查询 和分别。IS NULLIS NOT NULL
例子:
Entry.objects.filter(pub_date__isnull=True)
SQL:
SELECT ... WHERE pub_date IS NULL;
3 API
API 格式 说明
filter() filter(** kwargs) 返回QuerySet包含与给定查找参数匹配的新对象。
exclude() exclude(** kwargs) 返回QuerySet包含与给定查找参数不匹配的新对象。
annotate() annotate( args,* kwargs) 表达式可以是简单值,对模型(或任何相关模型)上的字段的引用,或者是通过与对象中的对象相关的对象计算的聚合表达式(平均值,总和等)QuerySet。
order_by() order_by(*fields) 默认情况下,a返回的结果按模型中选项QuerySet给出的排序元组排序。您可以使用该方法在每个基础上覆盖它。
reverse() reverse() 使用此reverse()方法可以反转返回查询集元素的顺序。reverse()第二次调用将排序恢复到正常方向。
distinct() distinct(*fields) 消除查询结果中的重复行。
values() values(fields, *expressions)