跨表不再迷路:Django 一对多级联过滤查询 4 个固定模板

举报
周杰伦本人 发表于 2025/08/31 20:24:23 2025/08/31
【摘要】 跨表不再迷路: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

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

全部回复

上滑加载中

设置昵称

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

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

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