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
相关产品推荐
相关产品推荐

