Python 从实例方法更改datetimefield的值

Python 从实例方法更改datetimefield的值,python,django,datetime,python-datetime,Python,Django,Datetime,Python Datetime,我有班级活动和班级参与者,它们有活动的外键。 如果我有: model_changed_stamp = models.DateTimeField() 许多参与者甚至参加了一次 当类事件的任何实例发生更改时,或者正在创建新实例时,我希望更新model\u changed\u stamp中的值。事实上,我还有很多其他的课程,比如Building,它也有事件的外键,我也想跟踪变化 我想到了在Event中使用实例类方法。我试过: def model_changed(self): value =

我有班级活动和班级参与者,它们有活动的外键。 如果我有:

model_changed_stamp = models.DateTimeField()
许多参与者甚至参加了一次

当类事件的任何实例发生更改时,或者正在创建新实例时,我希望更新
model\u changed\u stamp
中的值。事实上,我还有很多其他的课程,比如Building,它也有事件的外键,我也想跟踪变化

我想到了在
Event
中使用实例类方法。我试过:

def model_changed(self):
    value = getattr(self, 'model_changed_stamp')
    value = datetime.now()
    setattr(self, 'model_changed_stamp', value)
然后在参与者或建筑的save()中,我想触发
self.event.model\u changed()

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


更新0: 根据一些阅读资料(例如两勺Django),在这种情况下,使用信号是一种过激行为


更新1:我尝试的
save(self)
方法中参与者课堂的以下建议:

def save(self):
    if self.id is None:
        self.event.model_changed()
事件中
我将
模型更改为
,如下所示:

def model_changed(self):
    self.model_changed_stamp = datetime.now()
    self.save()
而且它不起作用-不更新日期,即创建新参与者的日期

更新2:正在工作!!!;-)


添加后:
self.save()
作为
model\u中的最后一行更改了
方法。

是的,信号是执行任务的好工具

你可以:

model_changed_stamp = models.DateTimeField(auto_now=True)
检查
auto\u 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

为什么不直接设定呢?为什么要和getattr和setattr乱搞

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

一个更好的解决方案是使用
auto\u now=True
定义字段,这样每当您保存时,这些字段都会随着当前时间自动更新。

您的
model\u changed
实现中的三行可以简单地写为
self.model\u changed\u stamp=datetime.now()
您是否考虑过只保留事件上的
changed\u stamp
字段,而不需要所有这些相关模型也保持更新?@SohanJain将有许多其他类将事件作为FK,并通知它更改。+1看起来很好,很简单!它会测试,如果有效,我肯定会接受。我试过了。我的答案更新1中的详细信息,但它不会在事件中更新
model\u changed\u stamp
字段中的日期。
self.save()