1

我正在尝试为我的网站建立一个 Reddit 或 Hackernews 风格的社区部分。Upvotes 和 downvotes 以及发布的日期和时间已经实施。Post 模型有一个方法可以返回基于 upvotes、downvotes 和 time 发布的特定帖子的分数。到现在为止还挺好。

现在我不想每次用户加载页面时都对我的所有帖子进行排序。我认为解决方案(如果我错了,请纠正我)是每隔几分钟运行一个脚本,按分数对所有帖子进行排序并保存它们。然后,当用户尝试加载首页时,视图将返回排序帖子列表中的前 20 个帖子,如果有人加载第二页,则视图将返回列表中的下 20 个项目,依此类推。

我天真的方法是有一个看起来像这样的模型:

class SortedPosts(models.Model):
    sortedPosts = models.ListField

然后每分钟运行一个脚本,如下所示:

from myproject.models import Post, SortedPosts
posts = Post.objects.all()
SortedPosts.sortedPosts = sorted(posts, key = lambda Post: Post.getScore())
SortedPosts.sortedPosts.save()

但是,唉,没有 ListField 这样的东西(至少在香草 Django 中)。当我搜索 SO 时,我发现的唯一解决方案是将列表序列化并将其存储在 TextField 中。那感觉不对。是吗?

Django 中没有 ListField 的事实让我怀疑我开始这样做的方式在更基本的方面是不正确的。这样做的正确方法是什么?

4

2 回答 2

0

好吧,假设您已经决定数据库(无论您使用什么)太慢了,而且 Python 也太慢了,无法在每个请求上为您排序列表,那么下一个“正确”的方式真的使用任何可用的众多第三方工具的缓存策略来解决这个问题。

看看memcached

于 2012-09-05T21:21:02.460 回答
0

实际上,在您的特定情况下,您想象的序列化/反序列化过程可能比使用每个请求对帖子进行排序需要更多时间。

对于 postgresql/mysql 数据库来说,1000 个对象实在是太少了。

没做什么。如果需要,请使用redis

要么你需要一个缓存机制,要么你不需要。在你的情况下似乎有点矫枉过正。

更新:

Good to know! What if my Post model has a rank field that is kept updated. Can I index by that field and somehow retrieve my posts in order?

所有 django 字段都采用可选参数“db_index”。如果将其设置为它将在True其上建立索引。

然后我想你想做类似的事情Post.objects.order_by('-rank')

“-”表示descending顺序。删除它,你有ascending订单。

于 2012-09-05T22:35:54.830 回答