Django官方文档小结(二) -- QuerySet
1 环境Python3.7.3Django==2.0.72 Field查找字段查找是指定SQL WHERE子句的内...
扫描右侧二维码阅读全文
05
2021/11

Django官方文档小结(二) -- QuerySet

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)

Last modification:November 5th, 2021 at 03:54 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment