如何在 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服务提供者配置与加载