我正在为评级书写网站,我不知道如何为登录用户实施投票系统。用户应该能够从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
现在我可以将rate和rates_count字段添加到Book,但我需要记住用户投票。显然我在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倍,那么计算的时间也是线性的吗?
很抱歉,如果我的问题很愚蠢,但我对数据库编程没有经验。谢谢你的回答。
答案 0 :(得分:1)
不是ORM和Django的专家,但大多数SQL数据库都有可以非常快速地计算的总数。如果你有一个数字字段用于评级,数学将非常容易和快速完成一个最多两个DB SQL调用(你也需要计算记录数)。检查django ORM是否有总数(我相信它),否则(因为我确定django orm也提供直接SQL),您可能需要制作一个自定义SQL查询来计算速率。此类查询将过滤所需的图书ID。
扩展算法并非易事。我想你可能会分开这个问题,一个关于模型,一个关于性能,一旦你有一些模型(也许是替代模型)