最适合网络开发者的网站
Django。初学者课程

尿素 西斯

Django QuerySet 过滤器


查询集过滤器

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 子句,使用“字段查找”。

字段查找是表示特定 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 年份匹配(日期)


评论