这个filter()
方法用于过滤您的搜索,并允许您仅返回与搜索词匹配的行。
正如我们在上一章中学到的,我们可以像这样过滤字段名称:
在 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) |
截取页面反馈部分,让我们更快修复内容!也可以直接跳过填写反馈内容!