Django中更新父模型的auto_now DateTimeField问题求助
问题解答
这段代码不可行,原因如下:
- 仅给关联的
Message对象的updated字段赋值,但没有调用self.message.save()将变更写入数据库,数据库里的Message记录不会有任何更新。 updated是auto_now类型的DateTimeField,该类型字段会在模型调用save()时自动设置为当前时间,直接赋值self.updated属于多余操作,甚至会被auto_now的特性覆盖。
可行实现方案
方案一:重写Attachment的save方法
在保存Attachment自身后,触发关联Message的保存操作(指定仅更新updated字段以提升性能):
def save(self, *args, **kwargs): super().save(*args, **kwargs) # 调用Message的save方法,让auto_now字段自动更新为当前时间 self.message.save(update_fields=['updated'])
方案二:使用Django信号(适合多场景触发的情况)
如果需要在多个操作修改Attachment时都更新Message的时间,可通过信号实现:
from django.db.models.signals import post_save from django.dispatch import receiver @receiver(post_save, sender=Attachment) def update_message_updated(sender, instance, **kwargs): instance.message.save(update_fields=['updated'])
注:使用update_fields参数可以避免不必要的字段更新,减少数据库开销。
内容的提问来源于stack exchange,提问作者Джони Депп
相关产品推荐
相关产品推荐

