Django QuerySet 过滤器
QuerySet 过滤器
filter()
方法用于过滤搜索,并让您可以仅返回与搜索词匹配的行。
正如我们在前一章中了解到的,我们可以像这样过滤字段名:
实例
仅返回名为 'Emil' 的记录:
mydata = Members.objects.filter(firstname='Emil').values()
结果
<QuerySet [
{'id': 1, 'firstname': 'Emil', 'lastname':
'Refsnes'}
]>
{'id': 1, 'firstname': 'Emil', 'lastname':
'Refsnes'}
]>
在 SQL 中,上述语句的编写方式如下:
SELECT * FROM members WHERE firstname = 'Emil';
AND
filter()
方法将参数作为 **kwargs(关键字参数),因此您可以通过逗号分隔多个字段来过滤它们。
实例
返回 lastname 为 "Refsnes" 且 id 为 2 的记录:
mydata = Members.objects.filter(lastname='Refsnes', id=2).values()
结果
<QuerySet [
{'id': 2, 'firstname': 'Tobias', 'lastname':
'Refsnes'}
]>
{'id': 2, 'firstname': 'Tobias', 'lastname':
'Refsnes'}
]>
在SQL中,上述语句的编写方式如下:
SELECT * FROM members WHERE lastname = 'Refsnes' AND id = 2;
OR
返回 firstname 为 Emil 或 firstname 为 Tobias 的记录(意思是:返回与任一查询匹配的记录,不一定两者都匹配)不像上面的和实例那样简单。
我们可以使用多个 filter()
方法,由 |
字符分隔。结果将合并为一个模型。
实例
返回 firstname 为 "Emil" 或 Tobias" 的记录:
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'}
]>
{'id': 1, 'firstname': 'Emil', 'lastname': 'Refsnes'}
{'id': 2, 'firstname': 'Tobias', 'lastname': 'Refsnes'}
]>
另一种常用方法是导入和使用 Q 表达式:
实例
返回 firstname 为 "Emil" 或 Tobias" 的记录:
from django.http import HttpResponse
from django.template import loader
from .models import Members
from django.db.models import Q
def testing(request):
mydata = Members.objects.filter(Q(firstname='Emil') | Q(firstname='Tobias')).values()
template = loader.get_template('testing_queries.html')
context = {
'mymembers': mydata,
}
return HttpResponse(template.render(context, request))
结果
<QuerySet [
{'id': 1, 'firstname': 'Emil', 'lastname': 'Refsnes'}
{'id': 2, 'firstname': 'Tobias', 'lastname': 'Refsnes'}
]>
{'id': 1, 'firstname': 'Emil', 'lastname': 'Refsnes'}
{'id': 2, 'firstname': 'Tobias', 'lastname': 'Refsnes'}
]>
在 SQL 中,上述语句的编写方式如下:
SELECT * FROM members WHERE firstname = 'Emil' OR firstname = 'Tobias';
字段查找
Django 有自己指定 SQL 语句和 WHERE 语句的方法。
要确定 Django 中的具体位置,请使用 "字段查找"。
字段查找是表示特定 SQL 关键字的关键字。
实例:
.filter(firstname__startswith='L');
与其作用一样的 SQL 语句为:
WHERE firstname LIKE '%L'
上述语句将返回 firstname 以 'L' 开头的记录。
字段查找的语法
所有字段查找关键字都必须用 fieldname 指定,后跟两个 (!) 下划线字符和关键字。
在我们的 Members 模型中,声明将这样写:
实例
返回 firstname 以字母 'L' 开头的记录:
mydata = Members.objects.filter(firstname__startswith='L').values()
结果
<QuerySet [
{'id': 3, 'firstname': 'Linus', 'lastname': 'Refsnes'},
{'id': 4, 'firstname': 'Lene', 'lastname': 'Refsnes'}
]>
{'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 年份 |