Django 过滤查询 10 连发:一眼看懂“下划线魔法”

举报
周杰伦本人 发表于 2025/08/31 20:15:57 2025/08/31
【摘要】 Django 过滤查询 10 连发:一眼看懂“下划线魔法”一句话:只要记住“字段__运算符=值”,90% 的查询都能拼出来。 语法模板(死记 3 秒)Model.objects.filter(字段__运算符=值)双下划线:字段和运算符之间的 唯一分隔符返回结果:QuerySet(列表,空也返回空列表,不会抛异常) 10 个实战例子需求代码对应 SQL书名含“福”BookInfo.objec...

Django 过滤查询 10 连发:一眼看懂“下划线魔法”

一句话:只要记住“字段__运算符=值”,90% 的查询都能拼出来。


语法模板(死记 3 秒)

Model.objects.filter(字段__运算符=)
  • 双下划线:字段和运算符之间的 唯一分隔符

  • 返回结果QuerySet(列表,空也返回空列表,不会抛异常)


10 个实战例子

需求 代码 对应 SQL
书名含“福” BookInfo.objects.filter(name__contains='福') WHERE name LIKE '%福%'
书名以“不”结尾 BookInfo.objects.filter(name__endswith='不') WHERE name LIKE '%不'
书名为空 BookInfo.objects.filter(name__isnull=True) WHERE name IS NULL
编号在 1,3,5 BookInfo.objects.filter(id__in=[1,3,5]) WHERE id IN (1,3,5)
编号大于 3 BookInfo.objects.filter(id__gt=3) WHERE id > 3
编号大于等于 3 BookInfo.objects.filter(id__gte=3) WHERE id >= 3
编号小于 3 BookInfo.objects.filter(id__lt=3) WHERE id < 3
编号不等于 3 BookInfo.objects.exclude(id=3) WHERE id != 3
1980 年出版 BookInfo.objects.filter(pub_date__year=1980) WHERE YEAR(pub_date)=1980
1990-01-01 之后 BookInfo.objects.filter(pub_date__gt='1990-01-01') WHERE pub_date > '1990-01-01'

易错点 & 记忆口诀

正确姿势
日期格式 必须是 YYYY-MM-DD,否则报错 You must be in YYYY-MM-DD
双下划线 连续写两个 _field__gt,不是 field_gt
contains / endswith 区分大小写 需要忽略大小写用 icontainsiendswith
get vs filter get 一条抛异常,filter 多条不抛异常

口诀

contains 模糊,endswith 结尾,in 多值,gt/gte/lt/lte 大小,exclude 反向,year/month/day 日期,双下划线永不忘!


练习一下

把下面的空填上:

# 1. 书名包含“剑”
BookInfo.objects.filter(name________='剑')

# 2. 编号小于 5
BookInfo.objects.filter(id________5)

# 3. 1985 年之后出版
BookInfo.objects.filter(pub_date________'1985-01-01')

答案:__contains, __lt, __gt

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。