正在更改实例方法中datetimefield的值



我有类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

相关内容

  • 没有找到相关文章

最新更新