Django 查询集 - 过滤器


查询集过滤器

这个filter()方法用于过滤您的搜索,并允许您仅返回与搜索词匹配的行。

正如我们在上一章中学到的,我们可以像这样过滤字段名称:

示例

仅返回名字为“Emil”的记录:

mydata = Member.objects.filter(firstname='Emil').values()
运行示例 »

在 SQL 中,上面的语句可以这样写:

SELECT * FROM members WHERE firstname = 'Emil';

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

示例

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

mydata = Member.objects.filter(lastname='Refsnes', id=2).values()
运行示例 »

在 SQL 中,上面的语句可以这样写:

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

或者

要返回名字为 Emil 或名字为 Tobias 的记录(意思是:返回与任一查询匹配的记录,不一定两者都匹配)并不像上面的 AND 示例那么简单。

我们可以使用多个filter()方法,用管道分隔|特点。结果将合并到一个模型中。

示例

返回名字为 "Emil" 或 Tobias 的记录:

mydata = Member.objects.filter(firstname='Emil').values() | Member.objects.filter(firstname='Tobias').values()
运行示例 »

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

示例

返回名字为 "Emil" 或 Tobias 的记录:

from django.http import HttpResponse
from django.template import loader
from .models import Member
from django.db.models import Q

def testing(request):
  mydata = Member.objects.filter(Q(firstname='Emil') | Q(firstname='Tobias')).values()
  template = loader.get_template('template.html')
  context = {
    'mymembers': mydata,
  }
  return HttpResponse(template.render(context, request))
运行示例 »

在 SQL 中,上面的语句可以这样写:

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

现场查找

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

要在 Django 中创建特定的 where 子句,请使用"Field lookups"。

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

例子:

使用__startswith关键字:

.filter(firstname__startswith='L');

与SQL语句相同:

WHERE firstname LIKE 'L%'

上述语句将返回名字以“L”开头的记录。

字段查找语法

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

在我们的Member模型,该语句将这样写:

示例

返回记录所在位置firstname以字母“L”开头:

mydata = Member.objects.filter(firstname__startswith='L').values()
运行示例 »

字段查找参考

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

Keyword Description
contains Contains the phrase
icontains Same as contains, but case-insensitive
date Matches a date
day Matches a date (day of month, 1-31) (for dates)
endswith Ends with
iendswith Same as endswidth, but case-insensitive
exact An exact match
iexact Same as exact, but case-insensitive
in Matches one of the values
isnull Matches NULL values
gt Greater than
gte Greater than, or equal to
hour Matches an hour (for datetimes)
lt Less than
lte Less than, or equal to
minute Matches a minute (for datetimes)
month Matches a month (for dates)
quarter Matches a quarter of the year (1-4) (for dates)
range Match between
regex Matches a regular expression
iregex Same as regex, but case-insensitive
second Matches a second (for datetimes)
startswith Starts with
istartswith Same as startswith, but case-insensitive
time Matches a time (for datetimes)
week Matches a week number (1-53) (for dates)
week_day Matches a day of week (1-7) 1 is sunday
iso_week_day Matches a ISO 8601 day of week (1-7) 1 is monday
year Matches a year (for dates)
iso_year Matches an ISO 8601 year (for dates)