Django QuerySet 过滤器

QuerySet 过滤器

filter() 方法用于过滤搜索,并让您可以仅返回与搜索词匹配的行。

正如我们在前一章中了解到的,我们可以像这样过滤字段名:

实例

仅返回名为 'Emil' 的记录:

  1. mydata = Members.objects.filter(firstname='Emil').values()
结果
<QuerySet [
{'id': 1, 'firstname': 'Emil', 'lastname':
'Refsnes'}
]>

在 SQL 中,上述语句的编写方式如下:

  1. SELECT * FROM members WHERE firstname = 'Emil';

AND

filter() 方法将参数作为 **kwargs(关键字参数),因此您可以通过逗号分隔多个字段来过滤它们。

实例

返回 lastname 为 "Refsnes" 且 id 为 2 的记录:

  1. mydata = Members.objects.filter(lastname='Refsnes', id=2).values()
结果
<QuerySet [
{'id': 2, 'firstname': 'Tobias', 'lastname':
'Refsnes'}
]>

在SQL中,上述语句的编写方式如下:

  1. SELECT * FROM members WHERE lastname = 'Refsnes' AND id = 2;

OR

返回 firstname 为 Emil 或 firstname 为 Tobias 的记录(意思是:返回与任一查询匹配的记录,不一定两者都匹配)不像上面的和实例那样简单。

我们可以使用多个 filter() 方法,由 | 字符分隔。结果将合并为一个模型。

实例

返回 firstname 为 "Emil" 或 Tobias" 的记录:

  1. mydata = Members.objects.filter(firstname='Emil').values() | Members.objects.filter(firstname='Tobias').val
结果
<QuerySet [
{'id': 1, 'firstname': 'Emil', 'lastname': 'Refsnes'}
{'id': 2, 'firstname': 'Tobias', 'lastname': 'Refsnes'}
]>

另一种常用方法是导入和使用 Q 表达式:

实例

返回 firstname 为 "Emil" 或 Tobias" 的记录:

  1. from django.http import HttpResponse
  2. from django.template import loader
  3. from .models import Members
  4. from django.db.models import Q
  5. def testing(request):
  6. mydata = Members.objects.filter(Q(firstname='Emil') | Q(firstname='Tobias')).values()
  7. template = loader.get_template('testing_queries.html')
  8. context = {
  9. 'mymembers': mydata,
  10. }
  11. return HttpResponse(template.render(context, request))
结果
<QuerySet [
{'id': 1, 'firstname': 'Emil', 'lastname': 'Refsnes'}
{'id': 2, 'firstname': 'Tobias', 'lastname': 'Refsnes'}
]>

在 SQL 中,上述语句的编写方式如下:

  1. SELECT * FROM members WHERE firstname = 'Emil' OR firstname = 'Tobias';

字段查找

Django 有自己指定 SQL 语句和 WHERE 语句的方法。

要确定 Django 中的具体位置,请使用 "字段查找"。

字段查找是表示特定 SQL 关键字的关键字。

实例:
  1. .filter(firstname__startswith='L');

与其作用一样的 SQL 语句为:

  1. WHERE firstname LIKE '%L'

上述语句将返回 firstname 以 'L' 开头的记录。


字段查找的语法

所有字段查找关键字都必须用 fieldname 指定,后跟两个 (!) 下划线字符和关键字。

在我们的 Members 模型中,声明将这样写:

实例

返回 firstname 以字母 'L' 开头的记录:

  1. mydata = Members.objects.filter(firstname__startswith='L').values()
结果
<QuerySet [
{'id': 3, 'firstname': 'Linus', 'lastname': 'Refsnes'},
{'id': 4, 'firstname': 'Lene', 'lastname': 'Refsnes'}
]>

字段查找参考

所有字段查找关键字的列表:

关键字描述
contains包含短语
icontains与 contains 相同,但不区分大小写
date匹配一个日期
day匹配日期(日期,1-31)
endswidth以…结束
iendswidth与 endswidth 相同,但不区分大小写
exact完全匹配
iexact与 exact 相同,但不区分大小写
in匹配其中一个值
isnull匹配空值
gt大于
gte大于或等于
hour匹配小时(用于 datetimes)
lt小于
lte小于或等于
minute匹配分钟(用于 datetimes)
month匹配月份(日期)
quarter匹配一年中的一个季度(1-4)
range匹配区间
regex匹配正则表达式
iregex与 regex 相同,但不区分大小写
second匹配秒 (对于 datetimes)
startswidth以…开始
istartswidth与 startswidth 相同,但不区分大小写
time匹配时间(对于 datetimes)
week匹配周数(1-53)
week_day匹配一周中的一天(1-7)1 是星期天
iso_week_day匹配 ISO 8601标准的工作日(1-7)1 为周一
year匹配年
iso_year匹配 ISO 8601 年份