Django - 存储所有已排序帖子的列表

时间:2012-09-05 21:14:45

标签: django django-models

我正在尝试为我的网站构建一个Reddit或Hackernews风格的社区部分。已经实施了Upvotes和downvotes以及发布的日期和时间。 Post模型有一个方法,该方法返回基于upvotes,downvotes和time posted计算的特定帖子的分数。到目前为止一切都很好。

现在我不希望每次用户加载页面时都要对我的所有帖子进行排序。我认为解决这个问题(如果我错了请纠正我)是每隔几分钟运行一个脚本,按分数对所有帖子进行排序并保存。然后,当用户尝试加载首页时,视图将返回排序帖子列表中的前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这样的东西(至少在vanilla Django中)。当我搜索SO时,我发现的唯一解决方案是序列化列表并将其存储在TextField中。那感觉不对。是吗?

Django中没有ListField,这让我怀疑我打算这样做的方式是不正确的。这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

好吧,假设您已经确定数据库(无论您使用的是什么)太慢了,并且Python也很慢,无法在每个请求中为您排序列表,那么下一个'正确'真正实现这一目标的方法是使用可用的众多第三方工具中的任何一种缓存策略。

请看memcached

答案 1 :(得分: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订单。