Django 查询集 - 过滤
查询集过滤
filter()
方法用于过滤搜索结果,并允许您仅返回与搜索词匹配的行。
正如我们在上一章中所学到的,我们可以像这样过滤字段名称
在 SQL 中,上面的语句将这样编写
SELECT * FROM members WHERE firstname = 'Emil';
AND
filter()
方法将参数作为 **kwargs(关键字参数)接收,因此您可以通过逗号分隔来过滤多个字段。
示例
返回 lastname 为 "Refsnes" 且 id 为 2 的记录
mydata = Member.objects.filter(lastname='Refsnes', id=2).values()
运行示例 »
在 SQL 中,上面的语句将这样编写
SELECT * FROM members WHERE lastname = 'Refsnes' AND id = 2;
OR
要返回 firstname 为 Emil 或 firstname 为 Tobias 的记录(意思是:返回匹配任一查询的记录,不一定同时匹配),并不像上面的 AND 示例那样容易。
我们可以使用多个 filter()
方法,用管道 |
字符分隔。结果将合并成一个模型。
示例
返回 firstname 为 "Emil" 或 Tobias 的记录
mydata = Member.objects.filter(firstname='Emil').values() | Member.objects.filter(firstname='Tobias').values()
运行示例 »
另一种常见的方法是导入并使用 Q 表达式
示例
返回 firstname 为 "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 子句,请使用 "字段查找"。
字段查找是表示特定 SQL 关键字的关键词。
示例
使用 __startswith
关键词
.filter(firstname__startswith='L');
与 SQL 语句相同
WHERE firstname LIKE 'L%'
上面的语句将返回 firstname 以 'L' 开头的记录。
字段查找语法
所有字段查找关键词都必须用字段名后跟两个 (!) 下划线字符和关键词来指定。
在我们的 Member
模型中,语句将这样编写
示例
返回 firstname
以字母 'L' 开头的记录
mydata = Member.objects.filter(firstname__startswith='L').values()
运行示例 »
字段查找参考
所有字段查找关键词的列表
关键词 | 描述 |
---|---|
contains | 包含短语 |
icontains | 与 contains 相同,但区分大小写 |
date | 匹配日期 |
day | 匹配日期(月份中的日期,1-31)(对于日期) |
endswith | 以…结尾 |
iendswith | 与 endswidth 相同,但区分大小写 |
exact | 精确匹配 |
iexact | 与 exact 相同,但区分大小写 |
in | 匹配其中一个值 |
isnull | 匹配 NULL 值 |
gt | 大于 |
gte | 大于或等于 |
hour | 匹配小时(对于日期时间) |
lt | 小于 |
lte | 小于或等于 |
minute | 匹配分钟(对于日期时间) |
month | 匹配月份(对于日期) |
quarter | 匹配年份的季度(1-4)(对于日期) |
range | 匹配之间 |
regex | 匹配正则表达式 |
iregex | 与 regex 相同,但区分大小写 |
second | 匹配秒(对于日期时间) |
startswith | 以…开头 |
istartswith | 与 startswith 相同,但区分大小写 |
time | 匹配时间(对于日期时间) |
week | 匹配星期数(1-53)(对于日期) |
week_day | 匹配星期几(1-7)1 是星期日 |
iso_week_day | 匹配 ISO 8601 星期几(1-7)1 是星期一 |
year | 匹配年份(对于日期) |
iso_year | 匹配 ISO 8601 年份(对于日期) |