我正在构建一个有问题的简单应用程序。每个问题都将进行二元投票(是/否)。我想记录每个用户的投票,因此每个用户每个问题只能获得一票(类似于堆栈溢出或reddit)。
我在这个问题上有一个votes_no和votes_yes int字段。每次添加投票时,都需要在事务中更新这些内容。我可以使用投票模型的保存方法吗?
class Question(models.Model):
part_isit = models.CharField(max_length=45)
part_if = models.CharField(max_length=90)
votes_no = models.IntegerField()
votes_yes = models.IntegerField()
author = models.ForeignKey(User)
create_date = models.DateField(auto_now_add=True)
VOTE_CHOICES = (
('Y', 'Yes'),
('N', 'No'),
)
class Vote(models.Model):
choice = models.CharField(max_length=1, choices=VOTE_CHOICES)
question = models.ForeignKey(Question)
author = models.ForeignKey(User)
create_date = models.DateField(auto_now_add=True)
def save(self):
# increment the questions vote totals
#save the vote
super(Vote, self).save();
答案 0 :(得分:1)
以下是否回答了这个问题?
class Question(models.Model):
blablabla #your definition
def count_yes(self):
return Vote.objects.filter(question__exact = self,
choice__exact = 'Y').count()
答案 1 :(得分:1)
我有点不同地改写了Igautier的方法:
class Question(models.Model):
# your defn
def count_yes(self):
return self.votes_set.filter(choice='Y')
def count_no(self):
return self.votes_set.filter(choice='N')
这背后的原因(和Igautier的答案)是数据已经全部存储在数据库中:存储了总数,同时每次调用这些方法时都会阻止额外的查询,这意味着保存时需要额外的工作,以及存储在数据库中的数据变得冲突的可能性。
如果你发现性能成为一个问题(我强烈建议你不要担心它,那么你可以看一下缓存查询集(尝试johnny-cache,自动或其他缓存系统),或者甚至数据库触发器我认为这可能会将其从请求循环中移出:数据库将在发生写入时更新值。显然,这将取决于您的DBMS。
最后,它不是直接回答你的问题,但你提到每个问题每个问题一票。
class Vote(models.Model):
# Your defn
class Meta:
unique_together = (
('author', 'question'),
)
然后,您将不必依赖应用程序逻辑来保持该约束的真实性。您可能会阻止用户就自己的问题进行投票。