2012-09-13 115 views
0

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

可以说我有以下模型:

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 

现在,我可以添加率和rates_count领域的书,但我需要记住用户投票。很显然,我需要在图书类多对多领域,我觉得这样的事情应该罚款:

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 

我不知道如果我需要在图书类率和rates_count。因为我可以从Vote模型计算它们的值。这里有几个未知数:

有多快/慢数据库引擎,比方说PostgreSQL,会计算所选书籍的平均费率,(增加和计算所有投票的投票数[平均费率=所有投票数/投票数]为10000票,以及如何为1000000票。手术时间是否持续增长?如果我的PC比服务器慢1000倍,是否需要进行计算也是线性的?

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

+0

如何'votes_on_books'表'ID'(Django给你这个), 'book_id'作为书的外键,'voter_id'作为用户的外键,以及'rating'?然后,当您呈现图书的页面时,您可以尝试获取记录,其中book_id =当前图书和user_id =当前ID;一击就意味着他们已经投了票,你不应该用投票界面来渲染这个页面。您还可以轻松查询当前图书的所有选票或当前用户的所有选票,而无需在表格上添加任何其他选项。 – chucksmash

+0

谢谢@lamChuckB。我想这是最好的选择。我的方法没有'votes = models.ManyToManyField(through ='Vote')',但我认为django使用这些信息来生成管理页面(我不确定这一点),所以我会留在我的模型中。 – fenuks

回答

1

不是ORM和Django的专家,但大多数SQL数据库的总数可以很快计算出来。如果您有数字字段的评级,数学会很容易和快速,并在一个最多两个DB SQL调用中完成(您还需要计算记录数)。检查django ORM是否有总计(我相信它),否则(因为我确信django orm也提供直接SQL),您可能需要制定自定义SQL查询以计算费率。这样的查询将过滤所需的书籍ID。

扩大算法并不是微不足道的。我想你可能会拆分这个问题,一个关于模型和另一个关于性能,一旦你有一些模型(也许替代模型)

+1

谢谢。我对'相当快'的答复感到满意。我问及可扩展性,因为我只是好奇,这对我来说不是生死攸关的问题。 – fenuks

+0

“相当快”是两条路径的结果,您可以通过获取单个图书的记录集(包含多个记录)来解决问题,然后计算循环中的评分(或使用ORMS函数为你做同样的事情)。 ORMs倾向于这种方法,而当你总共使用SQL你会得到一个结果的总和和处理将在SQL服务器端完成(通常比其他方法快得多) – ljgww