我做了一个下面给出的投票模型。我的博客模型有两个操作来支持或反对特定的博客。例如,当单个用户投票时,Blog 中的投票字段会增加,并且 UserVote 模型有记录,当同一用户投票时,它会更改其 vote_type 并更新记录。
当第二个用户投票时,问题就出现了。在一个 upvote 之后,当第二个用户 downvote 时,它表示他已经投票(尽管它应该将他的 vote_type 更改为 downvote)
我一直在解决这个问题,但在任何地方都找不到解决方案。
class Blog(models.Model):
title = models.CharField(max_length=100, blank=True, default='')
description = models.TextField(max_length=1500)
created = models.DateTimeField(auto_now_add=True)
owner = models.ForeignKey('auth.User', related_name='blog', on_delete=models.CASCADE, null=True)
image = models.FileField(blank=True, null=True)
votes = models.IntegerField(default=0)
def upvote(self, user):
try:
if UserVote.objects.filter(user=user, blog=self, vote_type='down').exists():
self.post_votes.update(user=user, blog=self, vote_type='up')
self.votes += 2
else:
self.post_votes.create(user=user, blog=self, vote_type='up')
self.votes += 1
self.save()
except IntegrityError:
return 'already_voted'
return 'ok'
def downvote(self, user):
try:
if UserVote.objects.filter(user=user, blog=self, vote_type='up').exists():
self.post_votes.update(user=user, blog=self, vote_type='down')
self.votes -= 2
else:
self.post_votes.create(user=user, blog=self, vote_type='down')
self.votes -= 1
self.save()
except IntegrityError:
return 'already_voted'
return 'ok'
class UserVote(models.Model):
user = models.ForeignKey('auth.User', related_name='user_votes', on_delete=models.CASCADE)
blog = models.ForeignKey(Blog, related_name='post_votes', on_delete=models.CASCADE)
vote_type = models.CharField(max_length=10)
class Meta:
unique_together = ('user', 'blog', 'vote_type')