Django QuerySet 过滤器
查询集过滤器
这 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 子句,使用“字段查找”。
字段查找是表示特定 SQL 关键字的关键字。
例子:
使用 __startswith
关键词:
.filter(firstname__startswith='L');
它与SQL语句相同:
WHERE firstname LIKE 'L%'
上述语句将返回名字以“L”开头的记录。
字段查找语法
所有字段查找关键字都必须以字段名称、后跟两个(!)下划线字符和关键字的形式指定。
在我们的 Member
模型中,语句可以这样写:
例子
返回记录 firstname
以字母“L”开头:
mydata = Member.objects.filter(firstname__startswith='L').values()
运行示例 »
字段查找参考
所有字段列表查找关键字:
关键词 | 描述 |
---|---|
包含 | 包含短语 |
图标包含 | 与包含相同,但不区分大小写 |
日期 | 匹配日期 |
天 | 匹配日期(月份中的日期,1-31)(用于日期) |
以。。结束 | 以。。结束 |
以结果为准 | 与 endswidth 相同,但不区分大小写 |
精确的 | 完全匹配 |
精确 | 与 exact 相同,但不区分大小写 |
在 | 匹配其中一个值 |
一片空白 | 匹配 NULL 值 |
GT | 比...更棒 |
特许技术专家 | 大于或等于 |
小时 | 匹配一小时(日期时间) |
特 | 少于 |
LTE | 小于或等于 |
分钟 | 匹配一分钟(针对日期时间) |
月 | 每月比赛(日期) |
四分之一 | 匹配一年中的某个季度 (1-4)(日期) |
范围 | 匹配 |
正则表达式 | 匹配正则表达式 |
正则表达式 | 与正则表达式相同,但不区分大小写 |
第二 | 匹配秒(针对日期时间) |
以。。开始 | 以。。开始 |
开始于 | 与 startswith 相同,但不区分大小写 |
时间 | 匹配时间(日期时间) |
星期 | 匹配周数(1-53)(用于日期) |
星期几 | 匹配星期几 (1-7) 1 是星期日 |
iso_week_day | 匹配 ISO 8601 星期几 (1-7) 1 是星期一 |
年 | 匹配年份(日期) |
等年 | 与 ISO 8601 年份匹配(日期) |