我有一个模型,我们称之为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?
答案 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.
注意:此代码尚未经过测试。