Django-通过更改其他模型中的一个更新模型中的整数字段值

时间:2019-02-16 12:59:31

标签: django django-models django-signals

这是我创建的要在我的models.py中进行练习的项目

class Post(models.Model):
   title = models.CharField(max_length = 140)
   author = models.ForeignKey(User, on_delete=models.CASCADE)
   votes = models.BigIntegerField(default=0, blank=True)


class Vote(models.Model):
   user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='voter')
   post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='vpost')

 @receiver(post_save, sender=Vote)
 def update_votes(sender, **kwargs):
    # # ??

在这里,我有一个Voteform,该用户可以对任何特定的帖子进行投票。那部分效果很好。

这是我的问题,每当用户对特定帖子投票时,我都希望Post模型中的投票字段也增加。

我知道我可以在HTML中使用{{post.vpost.count}}显示它。但是我要在这里增加。

我尝试过的其他方式

class Vote(models.Model):
   user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='voter')
   post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='vpost')

 def update_votes(self):
     p = self.post
     p.votes += 1
     p.save()

这个只能工作一次,从第二次开始就不工作,所以我想使用信号方法。那么如何使用信号更新Post模型中的表决字段?

1 个答案:

答案 0 :(得分:1)

附近。我将Post.votes重命名为Post.votes_count,因为votes表示反向关系。

@receiver(post_save, sender=Vote)
def update_votes(sender, instance, **kwargs):
    post = instance.post
    post.votes_count += 1
    post.save()

尽管您可能希望通过引入另一个查询来确保计数正确:

@receiver(post_save, sender=Vote)
def update_votes(sender, instance, **kwargs):
    post = instance.post
    post.votes_count = post.votes_set.all().count()
    post.save()

当/如果删除Vote以确保计数正确,您可能还想这样做。

请记住,您也可以只使用Vote的{​​{1}}方法执行此操作,而不需要信号。

您也可以 根据自己的情况将其作为日常工作或任务