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

2020-11-09 10:05:30 浏览数 (1)

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

日期字段的日


  1. 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;
  1. 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;
  1. contains

区分大小写的包含。

例子:

代码语言:javascript复制
Entry.objects.get(headline__contains='Lennon')

SQL:

代码语言:javascript复制
SELECT ... WHERE headline LIKE '%Lennon%';

注意:

SQLite不支持区分大小写的LIKE语句; contains 就像icontainsSQLite一样。

  1. icontains

不区分大小写的包含。

例子:

代码语言:javascript复制
Entry.objects.get(headline__icontains='Lennon')

SQL:

代码语言:javascript复制
SELECT ... WHERE headline ILIKE '%Lennon%';
  1. 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%')
  1. gt/gte/lt/lte

例子:

代码语言:javascript复制
Entry.objects.filter(id__gt=4)

SQL:

代码语言:javascript复制
SELECT ... WHERE id > 4;
  1. startswith

区分大小写的开头。

例子:

代码语言:javascript复制
Entry.objects.filter(headline__startswith='Lennon')

SQL:

代码语言:javascript复制
SELECT ... WHERE headline LIKE 'Lennon%';

注意:

SQLite不支持区分大小写的LIKE语句; startswith就像istartswith在SQLite中一样。

  1. istartswith

不区分大小写的开头。

例子:

代码语言:javascript复制
Entry.objects.filter(headline__istartswith='Lennon')

SQL:

代码语言:javascript复制
SELECT ... WHERE headline ILIKE 'Lennon%';
  1. endswith

区分大小写的结尾。

例子:

代码语言:javascript复制
Entry.objects.filter(headline__endswith='Lennon')

SQL:

代码语言:javascript复制
SELECT ... WHERE headline LIKE '%Lennon';

注意:

SQLite不支持区分大小写的LIKE语句; endswith就像iendswith在SQLite中一样。

  1. iendswith

不区分大小写的结尾。

例子:

代码语言:javascript复制
Entry.objects.filter(headline__iendswith='Lennon')

SQL:

代码语言:javascript复制
SELECT ... WHERE headline ILIKE '%Lennon';
  1. 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';
  1. 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代码片段,因为相关查询的实现因不同的数据库引擎而异。
  1. 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';
  1. 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代码片段,因为相关查询的实现因不同的数据库引擎而异。
  1. 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)

0 人点赞