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()