2010-12-18 36 views
0

我正在构建一个有问题的简单应用程序。每个问题都会有一个二元投票(是/否)。我想记录每个用户的投票,所以每个用户每个问题只能得到一个投票(类似于堆栈溢出或reddit)。从模型保存方法操作另一个模型的数据

我在这个问题上有一个vote_no和votes_yes int字段。每次添加投票时,这些都需要在交易中更新。我可以从Vote模型的保存方法中做到这一点吗?

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(); 

回答

1

下面回答这个问题吗?

class Question(models.Model): 
    blablabla #your definition 

    def count_yes(self): 
     return Vote.objects.filter(question__exact = self, 
            choice__exact = 'Y').count() 
+0

它的工作原理,谢谢。我唯一不喜欢的是可扩展性。它将检索所有投票对象作为列表。我宁愿让ORM做聚合查询。 BTW有一个错字(选择应该是选择)。 – Keyo 2010-12-18 07:53:27

+0

我的错误,就是如何在ORM中完成计数查询。 – Keyo 2010-12-18 08:10:04

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'), 
     ) 

然后,您将不必依赖应用程序逻辑来保持该约束为真。尽管如此,你可能会阻止用户对自己的问题进行投票。

+0

我在想我可能会重写投票模型保存方法并添加一个事务来增加存储在问题表上的投票值。 – Keyo 2010-12-18 10:58:29

+0

嗯。如果两个人同时投票会发生什么?每一笔交易都将在交易中进行,但仍会存在竞争状况。 – 2010-12-21 08:08:31

相关问题