【问题标题】:Django - Update integer field value in one model by change in otherDjango - 通过更改另一个模型来更新一个模型中的整数字段值
【发布时间】:2019-02-16 12:59:31
【问题描述】:

这是我为练习而创建的项目,在我的 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,该用户可以对任何特定帖子进行投票。那部分效果很好。

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

我知道我可以在我的 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 模型中的投票字段呢?

【问题讨论】:

  • 当您可以通过简单的post.vote_set.count() 调用获得它时,我不认为这是您想要存储在单独字段中的内容,而无需麻烦地保持计数最新。这样做的唯一原因是由于添加了查询,性能明显不足。是这样吗?
  • 我知道这一点,问题中也提到过。这是我为学习而练习的一种情况。

标签: django django-models django-signals


【解决方案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 的 save 方法中执行此操作,而不需要信号。

您可以也根据您的情况将其作为 cronjob 或任务来执行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2011-09-04
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    相关资源
    最近更新 更多