我有类Event和class Participant,它有Event的外键。 在活动中我有:
model_changed_stamp = models.DateTimeField()
许多参与者都参与其中。
当任何类事件的实例发生更改或正在创建新实例时,我希望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)
然后在参与者的保存()中,或建筑物我想解雇self.event.model_changed()
我想知道如何做到这一点。我应该使用信号吗?
更新0: 根据一些阅读(例如两勺Django),使用信号对于这种情况来说是一种过度杀伤。
更新1:我尝试在save(self)
方法的参与者课程中提出Daniel Roseman的建议:
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:工作!!! ; - )
在self.save()
方法中添加:model_changed
作为最后一行。
答案 0 :(得分:1)
为什么不直接设置它?为什么所有这些都与getattr和setattr有关?
def model_changed(self):
self.model_changed_stamp = datetime.datetime.now()
更好的解决方案是使用auto_now=True
定义字段,这样每当您保存时,它们都会使用当前时间自动更新。
答案 1 :(得分:0)
是的,信号是你工作的好工具。
你可以写:
model_changed_stamp = models.DateTimeField(auto_now=True)
检查docs 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