更改集时更改模型

时间:2014-04-09 18:15:03

标签: python django

我有一个模型,我们称之为Post。我有另一个模型,我们称之为Comment。评论可以有很多帖子。换句话说,它看起来有点像这样:

class Comment(models.Model):

      post = models.ForeignKey('app.Post', blank=True, null=True)

My Post模型有一个last_modified字段,看起来像这样

class Post(models.Model):

    last_modified = models.DateTimeField(auto_now=True)

当我直接对Post进行更改时,最后修改的时间戳很容易更新。但是,我需要last_modified来反映模型的comment_set何时发生了变化 - 换句话说,当添加Comment时。

我希望将此逻辑保存在Post模型本身中,而不是将其添加到Comment的保存方法或类似的东西中,这样我就可以保持模型像可能。是否有任何类似于Django m2m_changed模型的功能可以让我在Post的评论集发生变化时更新last_modified?

2 个答案:

答案 0 :(得分:2)

为此,您应该使用Django signals进行调查。具体而言,模型可以发送post_save信号,指示何时完成模型的保存。在您的情况下,您应该编写一个函数来接收已保存Comment的信号。

在该函数正文的内部,您将更新关联的last_modified的{​​{1}}。通过这种方式,您基本上定义了一个在数据库更新上运行的python触发器。

答案 1 :(得分:1)

像其他答案所说的那样使用Django信号。这里有一个如何做你想做的事的例子。

处理程序函数可以像这样实现:

from django.signals import post_save
from django.dispatch importm receiver

import datetime

class Post(models.Model):
    last_modified = models.DateTimeField(auto_now=True)

class Comment(models.Model):
      post = models.ForeignKey('app.Post', blank=True, null=True)

@receiver(post_save, sender=Comment)
def update_post(request, **kwargs):
    comment = kwargs['instance'] # Instance that receives the signal.
    created = kwargs['created']  # True if was created.
    if created:
        post = comment.post.last_modified = datetime.datetime.now() # Update post date.
        post.save() # Save the modified post.

注意:此代码尚未经过测试。