从模型保存方法操作另一个模型的数据

时间:2010-12-18 07:16:29

标签: python django django-models

我正在构建一个有问题的简单应用程序。每个问题都将进行二元投票(是/否)。我想记录每个用户的投票,因此每个用户每个问题只能获得一票(类似于堆栈溢出或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();

2 个答案:

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

然后,您将不必依赖应用程序逻辑来保持该约束的真实性。您可能会阻止用户就自己的问题进行投票。