Django更新记录时date_updated字段无法自动更新问题求助
解决Django中update()方法不更新date_updated字段的问题
你的问题核心在于:Django的QuerySet.update()方法是直接生成数据库UPDATE语句执行,不会触发模型的save()方法,也不会触发auto_now=True的自动更新逻辑。不管你在基类还是子类重写save(),只要用update()就不会走这些代码。
给你几个可行的解决办法:
方法一:手动在update()中指定date_updated
直接在更新时把date_updated字段加进去,简单高效:
from django.utils import timezone # 示例更新代码 data_to_update = {"field1": "new_value", "field2": 123} OtherClass.objects.filter(id=target_id).update(**data_to_update, date_updated=timezone.now())
方法二:改用实例save()方式更新
先获取模型实例,修改属性后调用save(),这样会触发基类的save()逻辑(或者auto_now=True的自动更新):
obj = OtherClass.objects.get(id=target_id) # 批量赋值属性 for attr, value in data_to_update.items(): setattr(obj, attr, value) obj.save()
注意:这种方式会先执行一次SELECT查询,再执行UPDATE,性能比直接update()稍差,但能触发模型的所有生命周期方法(比如信号、自定义save逻辑)。
额外优化:移除冗余代码
你当前的Base类中,date_updated = models.DateTimeField(auto_now=True)和save()里的手动赋值是重复的,二者留一个就行:
- 如果保留auto_now=True,可以删掉save()方法里的
self.date_updated = django.timezone.now(); - 如果想手动控制,就把auto_now=True改成
auto_now_add=False(或者直接去掉),保留save()里的赋值逻辑。
内容的提问来源于stack exchange,提问作者Alonso
相关产品推荐
相关产品推荐

