从实例方法更改datetimefield的值

时间:2014-03-28 17:35:06

标签: python django datetime python-datetime

我有类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作为最后一行。

2 个答案:

答案 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