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

Django-存储所有已排序帖子的列表,django,django-models,Django,Django Models,我正在尝试为我的网站建立一个Reddit或Hackernews风格的社区部分。已实施向上投票和向下投票,并公布日期和时间。Post模型有一个方法,该方法返回特定Post的分数,该分数根据向上投票、向下投票和发布时间计算得出。到目前为止还不错 现在,我不想每次用户加载页面时都对我的所有帖子进行排序。我认为解决这个问题的办法(如果我错了,请纠正我)是每隔几分钟运行一个脚本,按照分数对所有帖子进行排序并保存它们。然后,当用户尝试加载首页时,视图将返回排序后的帖子列表中的前20个帖子,如果有人加载第二个

我正在尝试为我的网站建立一个Reddit或Hackernews风格的社区部分。已实施向上投票和向下投票,并公布日期和时间。Post模型有一个方法,该方法返回特定Post的分数,该分数根据向上投票、向下投票和发布时间计算得出。到目前为止还不错

现在,我不想每次用户加载页面时都对我的所有帖子进行排序。我认为解决这个问题的办法(如果我错了,请纠正我)是每隔几分钟运行一个脚本,按照分数对所有帖子进行排序并保存它们。然后,当用户尝试加载首页时,视图将返回排序后的帖子列表中的前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()
然后是每分钟运行的脚本,如下所示:

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中是这样的。)当我在上面搜索时,我找到的唯一解决方案是序列化列表并将其存储在TextField中。这感觉不对。是吗


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

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


看看。

实际上,在您的特定情况下,序列化/反序列化过程 您可以想象,这可能比根据每个请求对帖子进行排序花费更多的时间

对于postgresql/mysql数据库来说,1000个对象少得可笑

什么也不做。如果需要,请使用

要么需要缓存机制,要么不需要。在你的情况下,似乎有点过分了

更新:

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\u by('-rank')


“-”表示降序顺序。删除它,您将获得升序。

这可能有一天会发生,我相信在这方面会有大量的优化工作要做,但我还没有完全做到这一点。比如说,我只有100个帖子,并且预计在未来6个月内会增长到1000个。分拣和存储不会那么糟糕。现在,我正在寻找一种在Django中实现这一点的方法,这种方法感觉不像是黑客(序列化并存储在文本字段中)。使用数据库或直接使用Python对1000篇文章进行排序对处理/加载时间的影响微乎其微,不成问题。我想你可能是在试图修复一些没有损坏的东西。也许我的问题措辞不正确:我不是在问如何最快地对列表进行排序和存储。我不知道如何在Django时期存储列表。这就是问题所在。我知道我可以序列化我的列表并将其存储在一个文本字段中,然后对其进行解码,这可能只需要1000篇文章就可以了,但这感觉像是一种黑客行为,而且是一种错误的方式,所以我问在Django中存储一个帖子列表的正确方式是什么。很高兴知道!如果我的帖子模型有一个不断更新的排名字段,该怎么办。我能按该字段编制索引并以某种方式按顺序检索我的帖子吗?类似Post.objects.indexedBy('rank')或类似的东西?