我有类Event和类Participant,它们有Event的外键。万一我有:
model_changed_stamp = models.DateTimeField()
许多参与者甚至参与其中。
当Event类的任何实例发生更改,或者正在创建新实例时,我希望model_changed_stamp
中的值将被更新。事实上,我还有很多其他类,比如Building,它们也有Event的外键,我也想跟踪变化。
我提出了在Event
中使用实例类方法的想法。我试过了:
def model_changed(self):
value = getattr(self, 'model_changed_stamp')
value = datetime.now()
setattr(self, 'model_changed_stamp', value)
然后在Participant或Building的save((中,我想启动self.event.model_changed()
我想知道如何做对。我应该使用信号吗?
更新0:根据一些阅读(例如Django的两个独家新闻(,在这种情况下,使用信号是一种过度使用。
更新1:以下是Daniel Roseman在save(self)
方法中Participant类中的建议:
def save(self):
if self.id is None:
self.event.model_changed()
在Event
中,我将model_changed
定义如下:
def model_changed(self):
self.model_changed_stamp = datetime.now()
self.save()
它不起作用——不更新日期,应该更新的时间,即创建新参与者的时间。
更新2:正在工作!!!;-(
在model_changed
方法中添加:self.save()
作为最后一行。
为什么不直接设置呢?为什么这些都是关于getattr和setattr的?
def model_changed(self):
self.model_changed_stamp = datetime.datetime.now()
一个更好的解决方案是用auto_now=True
定义字段,这样无论何时保存,它们都会自动更新为当前时间。
是的,信号是完成任务的好工具。
你可以看到:
model_changed_stamp = models.DateTimeField(auto_now=True)
检查文档中的auto_now
功能。
然后:
from django.db.models.signals import post_save
@receiver(post_save)
def post_save_event_handler(sender, instance, **kwargs):
if not sender in [Building, Participant, ...]:
return
instance.event.save() #updates model_changed_stamp