Django 过滤查询 10 连发:一眼看懂“下划线魔法”
【摘要】 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 区分大小写 | 需要忽略大小写用 icontains、iendswith |
| 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)