Django - 通过更改另一个模型来更新一个模型中的整数字段值
Django - Update integer field value in one model by change in other
这是我创建的练习项目,在我的 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。那部分效果很好。
这是我的问题,每当用户对特定 post 投票时,我希望 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 模型中的投票字段?
快到了。我会将 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()
您可能还想这样做 when/if 删除 Vote
以确保计数正确。
请记住,您也可以只在 Vote
的 save
方法中执行此操作,而不需要信号。
您可以也根据您的情况将此作为 cronjob 或任务
这是我创建的练习项目,在我的 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。那部分效果很好。
这是我的问题,每当用户对特定 post 投票时,我希望 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 模型中的投票字段?
快到了。我会将 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()
您可能还想这样做 when/if 删除 Vote
以确保计数正确。
请记住,您也可以只在 Vote
的 save
方法中执行此操作,而不需要信号。
您可以也根据您的情况将此作为 cronjob 或任务