【问题标题】:Django model for voting system投票系统的Django模型
【发布时间】: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 倍,那么计算所需的时间也是线性的吗?

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

【问题讨论】:

  • 一个带有字段idvotes_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


【解决方案1】:

不是 ORM 和 Django 方面的专家,但大多数 SQL 数据库都有可以很快计算的总数。如果您有评级的数字字段,那么数学将非常简单快捷,并且最多可以在两个 DB SQL 调用中完成(您也需要计算记录数)。检查 django ORM 是否有总计(我相信有),否则(我确信 django orm 也提供直接 SQL)您可能需要制作自定义 SQL 查询来计算费率。此类查询将过滤所需的图书 ID。

扩大算法规模并非易事。我想你也许应该把这个问题分开,一个关于模型,另一个关于性能,一旦你有一些模型(可能还有替代模型)

【讨论】:

  • 谢谢。我对“相当快”的回答感到满意。我问可扩展性是因为我只是好奇,这对我来说不是生死攸关的问题。
  • “相当快”是两条路径的结果,您可以通过获取单本书(可能是许多记录)的记录集(含费率)来解决问题,然后循环计算评分(或使用 ORMS 函数对你做同样的事情)。 ORM 会倾向于这种方法,而当您使用 SQL total 时,您会得到一个带有总数的结果,并且处理将在 SQL 服务器端完成(通常比其他方法快得多)
猜你喜欢
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多