【问题标题】:changing value of datetimefield from instance method从实例方法更改日期时间字段的值
【发布时间】:2014-05-08 07:37:03
【问题描述】:

我有 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 的 save() 或 Building 我想开火 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 方法的最后一行。

【问题讨论】:

  • model_changed 的实现中的三行可以简单地写成self.model_changed_stamp = datetime.now()
  • 您是否考虑过只在 Event 上保留 changed_stamp 字段,而不需要所有这些相关模型也保持更新?
  • @SohanJain 会有许多其他类将 Event 作为 FK,并通知它有关更改。

标签: python django datetime python-datetime


【解决方案1】:

为什么不直接设置呢?为什么要搞砸 getattr 和 setattr?

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

更好的解决方案是使用auto_now=True 定义字段,这样每次保存时它们都会自动更新为当前时间。

【讨论】:

  • +1 看起来又漂亮又简单!它会测试吗,如果有效,我肯定会接受。
  • 我试过了。我的答案更新 1 中的详细信息,但它没有更新 Event 中 model_changed_stamp 字段中的日期。
  • self.save() 需要添加到您的方法中才能正常工作。
【解决方案2】:

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

你可以写:

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

【讨论】:

  • 以及如何发送信号?
  • 查看docs
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
  • 2014-01-18
相关资源
最近更新 更多