跨表不再迷路:Django 一对多级联过滤查询 4 个固定模板
【摘要】 跨表不再迷路:Django 一对多级联过滤查询 4 个固定模板 1 背景:为什么要跨表查?我们在日常开发中经常遇到这样的需求:运营同学:“把郭靖所在的书找出来。”产品经理:“把阅读量大于 30 的书里所有人物列出来。”这些需求都绕不开同一个关键词——跨表。在 Django ORM 里,跨表的核心就是“关联模型类名小写 + 双下划线 + 字段名”。 2 一对多关系回顾书籍表 BookInfo...
跨表不再迷路:Django 一对多级联过滤查询 4 个固定模板
1 背景:为什么要跨表查?
我们在日常开发中经常遇到这样的需求:
-
运营同学:“把郭靖所在的书找出来。”
-
产品经理:“把阅读量大于 30 的书里所有人物列出来。”
这些需求都绕不开同一个关键词——跨表。在 Django ORM 里,跨表的核心就是“关联模型类名小写 + 双下划线 + 字段名”。
2 一对多关系回顾
-
书籍表 BookInfo(一)
-
人物表 PeopleInfo(多)
-
PeopleInfo 里有外键:
book = ForeignKey(BookInfo, on_delete=models.CASCADE)
3 四个固定模板(背下来就能写)
需求方向 | 模板写法 | 示例代码 |
---|---|---|
1️⃣ 从“一”到“多”(书 → 人) | book.peopleinfo_set.all() |
BookInfo.objects.get(id=1).peopleinfo_set.all() |
2️⃣ 从“多”到“一”(人 → 书) | person.book |
PeopleInfo.objects.get(id=1).book |
3️⃣ 跨表过滤(按人物找书) | BookInfo.objects.filter(peopleinfo__字段__运算符=值) |
BookInfo.objects.filter(peopleinfo__name__exact='郭靖') |
4️⃣ 反向过滤(按书找人) | PeopleInfo.objects.filter(book__字段__运算符=值) |
PeopleInfo.objects.filter(book__read_count__gt=30) |
4 现场验证
示例 1:查询“郭靖”所在的书
BookInfo.objects.filter(peopleinfo__name='郭靖')
# 结果:<QuerySet [<BookInfo: 射雕英雄传>]>
示例 2:查询《天龙八部》里的所有人物
PeopleInfo.objects.filter(book__name='天龙八部')
# 结果:<QuerySet [<PeopleInfo: 乔峰>, <PeopleInfo: 段誉>, ...]>
示例 3:阅读量 > 30 的书中所有人物
PeopleInfo.objects.filter(book__read_count__gt=30)
5 易错点提醒
-
peopleinfo__ 里的 peopleinfo 是 关联模型类名小写,不是表名。
-
双下划线 一定要写两个
_
,否则解析失败。 -
返回类型 永远是
QuerySet
,可继续链式过滤。
6 总结
正向外键直接点,反向
_set
全拿走;
跨表过滤用双下,模板背熟永不愁。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)