1

我有 Event 类和 Participant 类,它们具有 Event 的外键。在事件中我有:

model_changed_stamp = models.DateTimeField()

许多参与者甚至参加了一场。

当 Event 类的任何实例发生更改或正在创建新实例时,我希望model_changed_stamp更新 in 的值。事实上,我还有很多其他类,比如 Building,它们也有 Event 的外键,我也想跟踪变化。

我想出了在Event. 我试过了:

def model_changed(self):
    value = getattr(self, 'model_changed_stamp')
    value = datetime.now()
    setattr(self, 'model_changed_stamp', value)

然后在参与者的 save() 或我想开火的建筑物中self.event.model_changed()

我想知道怎么做。我应该使用信号吗?


更新0:根据一些阅读(例如Django的两勺),使用信号对于这种情况来说是一种过度杀伤力。


更新 1:在我尝试的方法中,按照Daniel Roseman在 Participant 类中的建议:save(self)

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方法中的最后一行。

4

2 回答 2

1

为什么不直接设置呢?为什么这一切都与 getattr 和 setattr 混在一起?

def model_changed(self):
    self.model_changed_stamp = datetime.datetime.now()

一个更好的解决方案是使用 定义字段auto_now=True,以便在您保存时自动更新为当前时间。

于 2014-03-28T21:00:21.423 回答
0

是的,信号是完成任务的好工具。

你可以写:

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
于 2014-03-28T18:04:41.350 回答