如何在 Django 中通过条件筛选获取数据库的多条记录并关联其他模型
发布时间 - 2026-01-28 00:00:00 点击率:次本文讲解如何使用 django 的 `filter()` 方法替代 `get()` 来安全查询多条数据库记录,并正确关联外键模型(如 student),避免“get() returned more than one”错误,同时提升视图逻辑的健壮性与可读性。
在 Django 开发中,Model.objects.get() 仅适用于预期且必须返回唯一一条记录的场景;一旦数据库中存在多条匹配数据,Django 将抛出 MultipleObjectsReturned 异常——这正是你遇到的 get() returned more than one ParentMystudent 错误的根本原因。
正确的做法是改用 Model.objects.filter(),它始终返回一个 QuerySet(即使为空或含多条),天然支持迭代、切片和链式查询,无需异常捕获即可安全处理零条、一条或多条结果。
以下是优化后的视图代码(含关键修正与最佳实践):
# views.py
from django.shortcuts import render
from django.db.models import Prefetch
def file_list_view(request):
# ✅ 使用 filter() 获取所有匹配的 ParentMystudent(注意:若 parent 字段是 ForeignKey,需确认是否应为 .parent_id)
parent_id = request.session.get('login_info', {}).get('id')
if not parent_id:
return render(request, 'file.html', {'query': []})
mystudents = ParentMystudent.objects.filter(parent=parent_id)
# ✅ 获取所有关联的 File 记录(使用 __in 支持多 mystudent_id)
mystudent_ids = mystudents.values_list('mystudent_id', flat=True)
files = File.objects.filter(studentid__in=mystudent_ids).select_related('studentid')
# ✅ 推荐:用 select_related 预加载外键(假设 File.studentid 是 ForeignKey(Student))
# 若 studentid 是外键字段名,则无需手动 get,模板中可直接访问 obj.studentid.lrn 等属性
# 此处假设字段名为 studentid → 对应 Student 模型实例

return render(request, 'file.html', {'query': files})⚠️ 注意事项:原代码中 File.objects.get(...) 和 Student.objects.get(...) 在循环内调用,会产生 N+1 查询问题,严重降低性能。应优先使用 select_related()(一对一/外键)或 prefetch_related()(多对多/反向关系)一次性预加载关联数据。mystudent.mystudent_id 是单个值,但 filter() 返回的是 QuerySet,不能直接取属性。因此需先提取 ID 列表(values_list('mystudent_id', flat=True)),再用 __in 进行批量匹配。模板中 obj.studentid.lrn 可直接使用(若已 select_related),无需手动赋值 obj.student = student;否则会覆盖原始字段且无法在模板中按预期渲染。
对应优化后的模板(file.html):
{% for obj in query %}
{{ forloop.counter }}
{{ obj.soano }}
{{ obj.studentid.lrn }}
{{ obj.studentid.lastname }}
查看文件
{% empty %}
暂无相关文件
{% endfor %}✅ 总结:
- 永远用 filter() 处理可能返回多条记录的查询;
- 用 select_related() 或 prefetch_related() 替代循环中多次 .get(),消除 N+1 查询;
- 善用 values_list(..., flat=True) 提取 ID 列表实现高效批量关联;
- 模板中尽量复用 ORM 预加载的关系,保持逻辑清晰、性能可控。
# html
# go
# session
# django
# lsp
# Filter
# 循环
# 切片
# 数据库
# 多条
# 加载
# 链式
# 可直接
# 的是
# 暂无
# 适用于
# 再用
# 唯一一
# 则会
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
网站图片在线制作软件,怎么在图片上做链接?
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
iOS正则表达式验证手机号、邮箱、身份证号等
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
html如何与html链接_实现多个HTML页面互相链接【互相】
Android实现代码画虚线边框背景效果
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
北京的网站制作公司有哪些,哪个视频网站最好?
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
QQ浏览器网页版登录入口 个人中心在线进入
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
Android自定义listview布局实现上拉加载下拉刷新功能
活动邀请函制作网站有哪些,活动邀请函文案?
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
Python文件异常处理策略_健壮性说明【指导】
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
Laravel Fortify是什么,和Jetstream有什么关系
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
如何在服务器上三步完成建站并提升流量?
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
Android使用GridView实现日历的简单功能
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
如何用IIS7快速搭建并优化网站站点?
Laravel如何实现用户密码重置功能?(完整流程代码)
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
详解jQuery停止动画——stop()方法的使用
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
焦点电影公司作品,电影焦点结局是什么?
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
高端网站建设与定制开发一站式解决方案 中企动力
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载


