Django QuerySet
本文主要内容是关于Django框架中QuerySet知识小结
#1 环境
代码语言:javascript复制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 ‘�a%’ |
xxx__icontains | 包含(忽略大小写) = ilike ‘�a%’,但是对于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。
例子:
代码语言:javascript复制Entry.objects.get(id__exact=14)
Entry.objects.get(id__exact=None)
SQL:
代码语言:javascript复制SELECT ... WHERE id = 14;
SELECT ... WHERE id IS NULL;
- iexact
不区分大小写的完全匹配,如果提供用于比较的值None,则将其解释为SQL NULL。
例子:
代码语言:javascript复制Blog.objects.get(name__iexact='beatles blog')
Blog.objects.get(name__iexact=None)
SQL:
代码语言:javascript复制SELECT ... WHERE name ILIKE 'beatles blog';
SELECT ... WHERE name IS NULL;
- contains
区分大小写的包含。
例子:
代码语言:javascript复制Entry.objects.get(headline__contains='Lennon')
SQL:
代码语言:javascript复制SELECT ... WHERE headline LIKE '%Lennon%';
注意:
SQLite不支持区分大小写的LIKE语句; contains 就像icontainsSQLite一样。
- icontains
不区分大小写的包含。
例子:
代码语言:javascript复制Entry.objects.get(headline__icontains='Lennon')
SQL:
代码语言:javascript复制SELECT ... WHERE headline ILIKE '%Lennon%';
- in
在给定的可迭代中; 通常是列表,元组或查询集。
例子:
代码语言:javascript复制Entry.objects.filter(id__in=[1, 3, 4])
SQL:
代码语言:javascript复制SELECT ... WHERE id IN (1, 3, 4);
还可以使用查询集动态评估值列表,而不是提供文字值列表:
代码语言:javascript复制inner_qs = Blog.objects.filter(name__contains='Cheddar')
entries = Entry.objects.filter(blog__in=inner_qs)
SQL:
代码语言:javascript复制SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE '%Cheddar%')
- gt/gte/lt/lte
例子:
代码语言:javascript复制Entry.objects.filter(id__gt=4)
SQL:
代码语言:javascript复制SELECT ... WHERE id > 4;
- startswith
区分大小写的开头。
例子:
代码语言:javascript复制Entry.objects.filter(headline__startswith='Lennon')
SQL:
代码语言:javascript复制SELECT ... WHERE headline LIKE 'Lennon%';
注意:
SQLite不支持区分大小写的LIKE语句; startswith就像istartswith在SQLite中一样。
- istartswith
不区分大小写的开头。
例子:
代码语言:javascript复制Entry.objects.filter(headline__istartswith='Lennon')
SQL:
代码语言:javascript复制SELECT ... WHERE headline ILIKE 'Lennon%';
- endswith
区分大小写的结尾。
例子:
代码语言:javascript复制Entry.objects.filter(headline__endswith='Lennon')
SQL:
代码语言:javascript复制SELECT ... WHERE headline LIKE '%Lennon';
注意:
SQLite不支持区分大小写的LIKE语句; endswith就像iendswith在SQLite中一样。
- iendswith
不区分大小写的结尾。
例子:
代码语言:javascript复制Entry.objects.filter(headline__iendswith='Lennon')
SQL:
代码语言:javascript复制SELECT ... WHERE headline ILIKE '%Lennon';
- range
范围测试(包括在内)。
例子:
代码语言:javascript复制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:
代码语言:javascript复制SELECT ... WHERE pub_date BETWEEN '2019-01-01' and '2019-03-31';
- date
对于datetime字段,将值转换为日期。允许链接其他字段查找。采用日期值。
例子:
代码语言:javascript复制Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))
SQL:
代码语言:javascript复制此查找不包含等效的SQL代码片段,因为相关查询的实现因不同的数据库引擎而异。
- year/month/day/week/week_day/quarter(取1到4之间的整数值,表示一年中的四分之一。)
对于日期和日期时间字段,确切的年份匹配。允许链接其他字段查找。需要整数年。
例子:
代码语言:javascript复制Entry.objects.filter(pub_date__year=2005)
Entry.objects.filter(pub_date__year__gte=2005)
SQL:
代码语言:javascript复制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值。
例子:
代码语言:javascript复制Entry.objects.filter(pub_date__time=datetime.time(14, 30))
Entry.objects.filter(pub_date__time__range=(datetime.time(8), datetime.time(17)))
SQL:
代码语言:javascript复制此查找不包含等效的SQL代码片段,因为相关查询的实现因不同的数据库引擎而异。
- isnull
采用任一True或False,其对应于SQL查询 和分别。IS NULLIS NOT NULL
例子:
代码语言:javascript复制Entry.objects.filter(pub_date__isnull=True)
SQL:
代码语言:javascript复制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) |