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

Django中save()方法内Model字段last_status_change未更新问题求助

Django模型save方法中字段无法保存的问题解决

核心结论

save()方法完全允许修改字段,你的问题和这个无关,是代码里的赋值错误导致的。

问题原因

你在判断confirmation_status状态变化时,只是定义了一个局部变量last_status_change = datetime.now(),但并没有把这个值赋值给模型实例的self.last_status_change。这个局部变量和模型字段没有任何关联,所以哪怕计算出正确的时间,也不会被同步到要保存的实例中,数据库自然不会更新这个字段。

解决方法

把局部变量的赋值改成对实例属性的赋值,同时建议使用Django提供的timezone.now()来获取时区感知的时间(需要先导入django.utils.timezone),修改后的代码如下:

from django.utils import timezone
from django.db import models

class MyModel(models.Model):
  first_name = models.CharField(max_length=100, verbose_name='Name')
  confirmation_status = models.CharField(
        choices=CONFIRMATION_STATUS_CHOICES,
        default='registered', max_length=20
    )
  last_status_change = models.DateTimeField(null=True, blank=True)

  def save(self, *args, **kwargs):
    if self.pk:
      original = MyModel.objects.get(pk=self.pk)
      if original.confirmation_status != self.confirmation_status:
        # 赋值给实例的字段属性,而不是局部变量
        self.last_status_change = timezone.now()
    return super(MyModel, self).save(*args, **kwargs)

额外优化提示:如果频繁调用save方法,每次查询原实例会产生额外数据库开销,可以用self._state.adding判断是否为新增实例(新增时无需对比原状态);也可以用django.db.models.signals的pre_save信号实现相同逻辑,不过当前场景下修改save方法已经足够简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:15:27