为什么“get(pk=1)”能查到书,而“filter(pk=1)”却给我一个列表?——用三个真实踩坑场景带你彻底分清

举报
周杰伦本人 发表于 2025/08/31 20:14:15 2025/08/31
【摘要】 为什么“get(pk=1)”能查到书,而“filter(pk=1)”却给我一个列表?——用三个真实踩坑场景带你彻底分清 Django 的 get、all、filter、count 场景 1:点进详情页,我只想拿一本书小明写详情视图:book = BookInfo.objects.filter(id=1)结果模板报错:'QuerySet' object has no attribute 'n...

为什么“get(pk=1)”能查到书,而“filter(pk=1)”却给我一个列表?——用三个真实踩坑场景带你彻底分清 Django 的 get、all、filter、count


场景 1:点进详情页,我只想拿一本书

小明写详情视图:

book = BookInfo.objects.filter(id=1)

结果模板报错:

'QuerySet' object has no attribute 'name'

原因filter 永远返回“列表”,哪怕只有一条记录。
修复

book = BookInfo.objects.get(id=1)   # 直接拿到对象

场景 2:后台列表页需要“所有书 + 总条数”

产品经理问:

“先给我全部书籍,再告诉我一共几本。”

错误写法

books = BookInfo.objects.all()
total = len(books)   

先把所有数据拉到内存再数

正确写法

books = BookInfo.objects.all()
total = books.count()  

数据库直接 COUNT(*),不占内存


场景 3:搜索框里输入“金庸”,结果为空

用户搜索“金庸”,前端提示:

“没有相关书籍”

代码

BookInfo.objects.get(name__contains='金庸')  # 抛 DoesNotExist

修复:用 filter,空结果也不报错

BookInfo.objects.filter(name__contains='金庸')   # 返回空列表 []

一张对照表,30 秒背下来

方法 返回类型 找不到时 典型用途
get(pk=1) 单个对象 抛异常 详情页
filter(pk=1) 列表(QuerySet) 空列表 列表页
all() 列表(QuerySet) 空列表 后台表格
count() 整数 0 分页统计

一句话总结

  • 只要一条get

  • 可能多条filter

  • 全要all

  • 只要数字count

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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