Django投票系统模型

时间:2012-09-13 20:34:48

标签: python database-design django-models

我正在为评级书写网站,我不知道如何为登录用户实施投票系统。用户应该能够从1-10评级,当然,系统应该记住他的投票,统计所有选票并计算平均费率。

假设我有以下型号:

class Book(models.Model):
    title = models.CharField(max_length=30)
    author = models.ForeignField(Author)
    #... other fields

class User(models.Model):
   first_name = models.CharField(max_length=50)
   last_name = models.CharField(max_length=30)
   #... other fields

现在我可以将rate和rates_count字段添加到Book,但我需要记住用户投票。显然我在Book类中需要ManyToMany字段,我认为这样的事情应该没问题:

class Vote(models.Model):
   user_who_voted = models.ForeignField(User)
   rated_book = models.ForeignField(Book)
   rate_date = models.DateField()
   rate = models.ForeignField(User)

class Book(models.Model):
    title = models.CharField(max_length=30)
    author = models.ForeignField(Author)
    votes = models.ManyToManyField(through='Vote')
    #... other fields

我想知道我是否需要Book类中的rate和rates_count。因为我可以从Vote模型计算它们的值。这里有一些未知数:

多快/慢的数据库引擎,比方说PostgreSQL,会计算所选图书的平均费率,(添加和计算所有选票投票[平均费率=所有投票数/投票数])为10000票,以及如何为1000000票。手术时间是否恒定?如果我的PC比服务器慢1000倍,那么计算的时间也是线性的吗?

很抱歉,如果我的问题很愚蠢,但我对数据库编程没有经验。谢谢你的回答。

1 个答案:

答案 0 :(得分:1)

不是ORM和Django的专家,但大多数SQL数据库都有可以非常快速地计算的总数。如果你有一个数字字段用于评级,数学将非常容易和快速完成一个最多两个DB SQL调用(你也需要计算记录数)。检查django ORM是否有总数(我相信它),否则(因为我确定django orm也提供直接SQL),您可能需要制作一个自定义SQL查询来计算速率。此类查询将过滤所需的图书ID。

扩展算法并非易事。我想你可能会分开这个问题,一个关于模型,一个关于性能,一旦你有一些模型(也许是替代模型)