【发布时间】:2012-09-14 04:44:02
【问题描述】:
我正在编写网站来评价书籍,但我不确定如何为登录用户实施投票系统。用户应该能够从 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
现在我可以向 Book 添加 rate 和 rates_count 字段,但我需要记住用户的投票。显然我需要 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 倍,那么计算所需的时间也是线性的吗?
对不起,如果我的问题很愚蠢,但我在数据库编程方面没有经验。感谢您的任何回答。
【问题讨论】:
-
一个带有字段
id的votes_on_books表怎么样(django 给你这个),book_id作为书籍的外键,voter_id作为用户的外键,@ 987654328@?然后,当您呈现一本书的页面时,您可以尝试获取 book_id = current book 和 user_id = current id 的记录;命中意味着他们已经投票,您不应该使用投票界面呈现此页面。您还可以轻松查询当前书籍的所有投票或当前用户的所有投票,而无需在表格中添加任何其他内容。 -
谢谢@lamChuckB。我想这是最好的选择。没有
votes = models.ManyToManyField(through='Vote'),我的方法是相同的,但我认为 django 使用此信息生成管理页面(我不确定),所以我将继续使用我的模型。
标签: python database-design django-models