QuerySet 过滤方法

收藏90

阅读1854

更新时间2025-08-21

Django QuerySet 过滤方法

filter() 方法用于过滤您的搜索,并允许您仅返回与搜索词匹配的行。

正如我们在上一章中学到的,我们可以像这样过滤字段名称:

实例

只返回firstname为"Emil"的记录:

mydata = Members.objects.filter(firstname='Emil').values()

结果

在 SQL 中,上面的语句会这样写:

SELECT * FROM members WHERE firstname = 'Emil';

AND

filter() 方法将参数作为 **kwargs(关键字参数),因此您可以通过用逗号分隔多个字段来过滤多个字段。

实例

返回 lastname 为 "Refsnes" id 为 2 的记录:

mydata = Members.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 = Members.objects.filter(firstname='Emil').values() | Members.objects.filter(firstname='Tobias').values()

结果

另一种常用的方法是导入和使用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))

结果

在 SQL 中,上面的语句会这样写:

SELECT * FROM members WHERE   firstname = 'Emil' OR firstname = 'Tobias';

字段查找

Django 有自己的方式来指定 SQL 语句和 WHERE 子句。

要明确 Django 中的 where 子句,请使用"字段查找"。

字段查找是表示特定 SQL 关键字的关键字。

实例:

.filter(firstname__startswith='L');

同SQL语句:

WHERE firstname LIKE '%L'

上述语句将返回 firstname 以 'L' 开头的记录。

字段查找语法

所有字段查找关键字必须用字段名指定,后跟两个(!)下划线字符和关键字。

在我们的 Members 模型中,语句会这样写:

实例

返回 firstname 以字母 'L' 开头的记录:

mydata = Members.objects.filter(firstname__startswith='L').values()

结果

字段查找参考

所有字段查找关键字的列表:

关键字 描述说明
contains 包含短语
icontains 与 contains 相同,但不区分大小写
date 匹配日期
day 匹配日期(月份中的某天,1-31)(用于日期)
endswidth 以...结束
iendswidth 与endswidth相同,但不区分大小写
exact 完全匹配
iexact 完全相同,但不区分大小写
in 匹配其中一个值
isnull 匹配 NULL 值
gt 大于
gte 大于或等于
hour 匹配一个小时(日期时间)
lt 小于
lte 小于或等于
minute 匹配一分钟(用于日期时间)
month 匹配一个月(用于日期)
quarter 匹配一年中的一个季度 (1-4)(用于日期)
range 匹配区间
regex 匹配正则表达式
iregex 与正则表达式相同,但不区分大小写
second 匹配一秒(用于日期时间)
startswidth 开始,区分大小写
istartswidth 与startswidth相同,但不区分大小写
time 匹配时间(用于日期时间)
week 匹配周数 (1-53)(用于日期)
week_day 匹配一周中的某一天 (1-7) 1 是星期日
iso_week_day 匹配 ISO 8601 星期几 (1-7) 1 是星期一
year 匹配一年(用于日期)
iso_year 匹配 ISO 8601 年份(用于日期)

科技资讯

更多

精选课程

更多
前端入门_HTML5
前端入门_HTML5

共29课时

61.7万人学习

CSS视频教程-玉女心经版
CSS视频教程-玉女心经版

共25课时

39.3万人学习

JavaScript极速入门_玉女心经系列
JavaScript极速入门_玉女心经系列

共43课时

70.9万人学习

独孤九贱(1)_HTML5视频教程
独孤九贱(1)_HTML5视频教程

共25课时

61.6万人学习

独孤九贱(2)_CSS视频教程
独孤九贱(2)_CSS视频教程

共22课时

23万人学习

独孤九贱(3)_JavaScript视频教程
独孤九贱(3)_JavaScript视频教程

共28课时

33.9万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时

125万人学习

关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号