为什么“get(pk=1)”能查到书,而“filter(pk=1)”却给我一个列表?——用三个真实踩坑场景带你彻底分清
【摘要】 为什么“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)