Python 投票系统的Django模型

Python 投票系统的Django模型,python,database-design,django-models,Python,Database Design,Django Models,我写的网站评级书,我不知道如何实现登录用户投票系统。用户应该能够从1-10对这本书进行评分,当然,系统应该记住他的投票,计算所有投票并计算平均投票率 假设我有以下模型: class Book(models.Model): title = models.CharField(max_length=30) author = models.ForeignField(Author) #... other fields 及 现在我可以在Book中添加rate和rates\u cou

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

假设我有以下模型:

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

现在我可以在Book中添加rate和rates\u 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
我想知道我是否需要在书本课上计算价格。因为我可以根据投票模型计算它们的值。以下是我的几个未知数:

数据库引擎(比如PostgreSQL)计算所选书籍的平均投票率(添加并计算所有投票[平均投票率=添加的所有投票/投票数])的速度有多快/慢,以及如何计算1000000票。手术时间是恒定的吗?若我的电脑速度比服务器慢1000倍,那个么计算所需的时间也是线性的吗


对不起,如果我的问题很傻,但我在数据库编程方面没有经验。谢谢您的回答。

不是ORM和Django方面的专家,但大多数SQL数据库都有可以快速计算的总数。若你们有一个数值字段来表示评级,那个么数学计算将非常简单和快速,并且只需一次最多两个DB的SQL调用就可以完成(你们还需要计算记录的数量)。检查django ORM是否有总计(我相信有),否则(因为我确信django ORM也提供了直接SQL),您可能需要创建一个自定义SQL查询来计算比率。这样的查询将过滤所需的图书id


扩大算法的规模并非小事。我想你应该把这个问题分开,一个是关于模型的,另一个是关于性能的,一旦你有了一些模型(可能还有其他模型)

在书上的
投票
表,带字段
id
(django给你这个),
book\u id
作为书的外键,
投票人id
作为用户的外键,和
评级
?然后,当您呈现一本书的页面时,您可以尝试获取记录,其中book_id=当前图书,user_id=当前id;点击表示他们已经投票,您不应该使用投票界面呈现此页面。您还可以轻松查询当前书籍的所有投票或当前用户的所有投票,而无需在表格上添加任何其他内容。谢谢@lamChuckB。我想这是最好的选择。如果没有
投票=models.ManyToManyField(通过class='Vote')
,我的方法是相同的,但我认为django使用这些信息来生成管理页面(我不确定这一点),所以我将继续使用我的模型。谢谢。我对“相当快”的回答感到满意。我问起可伸缩性是因为我很好奇,这对我来说不是生死攸关的问题。“相当快”是两条路径的结果,你可以解决一个问题,获取一组记录(带有速率)给一本书(可能有很多记录),然后在一个循环中计算评级(或者使用ORMS函数,也可以为你做同样的事情)。ORMs倾向于这种方法,而当您使用sqltotal时,您将得到一个total结果,并且处理将在sqlserver端完成(通常比其他方法快得多)
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