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

Django模型auto_now字段编辑记录时未自动更新问题排查

问题解答

问题1:新建记录时date_added和date_modified一致是否正常

是正常特性:

  • auto_now_add 会在记录首次创建时自动写入当前时间
  • auto_now 会在每次调用模型的save()方法时自动写入当前时间
    新建记录时两个字段同时被写入当前时间,因此值完全一致,属于预期行为。

问题2:编辑记录时date_modified不更新的原因

你使用了Django ORM的QuerySet.update()方法执行更新,这个方法是直接生成SQL语句执行数据库层面的更新,不会触发模型层的save()逻辑,而auto_now、auto_now_add的自动更新逻辑是绑定在模型save()方法上的,因此不会被触发。

解决方案

方案1:修改模型实例后调用save()(推荐)

你已经提前查询到了对应pk的Job实例,直接修改实例属性后调用save()即可触发auto_now自动更新:

def job_edit(request, pk):
    job = Job.objects.get(pk=pk)
    if request.method == "POST":
        job_form = JobForm(request.POST)          
        if job_form.is_valid():
            option = request.POST.get('check')
            time = request.POST.get('servicetime')
            date = request.POST.get('servicedate')
            version = request.POST.get('version')
            # 直接修改实例属性
            job.enabled = option
            job.start_time = time
            job.start_date = date
            job.version = version
            # 调用save触发auto_now更新
            job.save()
            # 修正redirect参数,redirect不需要传递上下文
            return redirect('/job/')
    return render(request, 'interface/job_edit.html',{'job': job})

方案2:update时手动传入更新时间

如果你需要保留update()的用法,需要手动在更新字段中添加date_modified:

# 先导入时区工具
from django.utils import timezone

# 更新时手动传入当前时间
Job.objects.filter(pk=pk).update(
    enabled=option,
    start_time = time,
    start_date = date,
    version = version,
    date_modified = timezone.now()
)

额外优化建议

  • 你已经使用了JobForm做参数校验,可直接使用job_form.save()完成更新,不需要手动逐个赋值字段,代码更简洁
  • 查询单条记录时建议使用get_object_or_404(Job, pk=pk)替代Job.objects.get(pk=pk),避免pk不存在时抛出500错误
  • redirect方法不需要传递上下文参数,上下文仅在render渲染模板时需要传递

内容的提问来源于stack exchange,提问作者L.Calvin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:54:08