You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中批量更新多个对象?注册日期超6天时批量修改Issue状态的实现疑问

解决多对象更新的报错与优化方案

嘿,我来帮你搞定这个问题!你遇到的get() returned more than one MaintenanceIssue错误,核心原因是get()方法的特性——它只能返回单个匹配的数据库对象,但你的库里现在有61条issue_status='On Going'的记录,直接用get()肯定会触发异常。

针对你要把注册超过6天的"On Going"状态改为"Pending"的需求,我给你两种实用方案,看你的场景选择:


方案1:批量更新(强烈推荐,效率拉满)

Django的查询集支持直接批量更新,不用挨个迭代保存,数据库只执行一次更新操作,性能比循环处理好太多。关键是要先准确筛选出符合条件的记录:

from datetime import datetime, timedelta

# 先算出6天前的时间点
six_days_ago = datetime.now() - timedelta(days=6)

# 筛选条件:状态是"on going"(注意数据库存的是小写!)+ 注册日期早于6天前
MaintenanceIssue.objects.filter(
    issue_status='on going',
    register_dt__lt=six_days_ago
).update(issue_status='pending')

划重点:你的模型里issue_status的choices选项,实际存到数据库的是小写的'on going'和'pending'(不是显示的'On going'/'Pending'),所以查询和更新必须用这些小写值,否则会找不到数据哦!


方案2:逐个迭代处理(适合需要额外操作的场景)

如果每条记录更新时还要做额外的事(比如发邮件通知、写操作日志),那可以先筛选出所有符合条件的对象,再循环处理:

from datetime import datetime, timedelta

six_days_ago = datetime.now() - timedelta(days=6)
# 用filter()获取所有符合条件的查询集,不会报错
on_going_issues = MaintenanceIssue.objects.filter(
    issue_status='on going',
    register_dt__lt=six_days_ago
)

for issue in on_going_issues:
    # 这里加你需要的额外逻辑,比如:
    # print(f"更新工单{issue.id}状态为Pending")
    issue.issue_status = 'pending'
    issue.save()

顺便说下你的pending_issue属性

这个属性虽然能计算单条记录的天数差,但它是Python层面的属性,没法直接用在数据库查询里(数据库不认识这个属性)。所以用register_dt__lt结合日期计算来筛选,是更高效的做法——筛选逻辑在数据库端完成,比先把所有数据拉到Python里再判断快多了。

内容的提问来源于stack exchange,提问作者HudsonBarroso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 00:33:14