我正在写网站评级书,我不知道如何实现登录用户的投票系统。用户应该能够对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倍,是否需要进行计算也是线性的?
对不起,如果我的问题很愚蠢,但我没有经验的数据库编程。谢谢你的回答。
如何'votes_on_books'表'ID'(Django给你这个), 'book_id'作为书的外键,'voter_id'作为用户的外键,以及'rating'?然后,当您呈现图书的页面时,您可以尝试获取记录,其中book_id =当前图书和user_id =当前ID;一击就意味着他们已经投了票,你不应该用投票界面来渲染这个页面。您还可以轻松查询当前图书的所有选票或当前用户的所有选票,而无需在表格上添加任何其他选项。 – chucksmash
谢谢@lamChuckB。我想这是最好的选择。我的方法没有'votes = models.ManyToManyField(through ='Vote')',但我认为django使用这些信息来生成管理页面(我不确定这一点),所以我会留在我的模型中。 – fenuks