获取缓存结果后的Django / Python排序

时间:2011-05-23 07:32:35

标签: python django sorting memcached

问候,

一些快速的东西(django 1.2.3,python 2.6,memcached)。

我有一个功能,我首先做一个有点昂贵的查询,当我做这个查询时,我做一个oder_by。然后我更新一些可能会改变结果顺序的值。然后我将所有值都放在缓存中。

然后在另一个函数中,我得到了缓存,我想求结果,以便它们再次有序。

所以这就像是。

function 1():
    mylist = myevent.people.order_by('-score')
    ....do up date....
    cache.set(cache_key,mylist)

function(2):
    my_cache_list = cache.get(cache_key)
    newlist = sorted(my_cache_list,key=operator.attrgetter('score'), reverse=True )

基于其他帖子,我认为这应该有效,但我得到一个类型错误,说my_cache_list是unsubsriptable。

有人有什么想法吗?我可能做了些蠢事......

感谢。

注意:更新了更改operator.attrgetter的operator.itemgetter已删除错误!上面的代码确实有效。问题在于使用operator.itemgetter。

3 个答案:

答案 0 :(得分:4)

Python函数sorted()适用于Mutable List Types,Django查询集不是这样:这就是你得到的错误基本上是告诉你的。从技术上讲,下标是通过索引访问列表元素的行为,如下所示:

list = ['a', 'b', 'c']
list[0] # This is a subscript

如果您在查询集上尝试该操作,它将失败并出现相同的异常:

list = MyModel.objects.all()
list[0] # This subscript will fail: a queryset doesn't support the operation

如果要保留加载有序查询集的方案,缓存结果并在缓存访问时重新排序它们,则必须将查询集转换为真实列表并将其存储在缓存中(这将需要更多缓存虽然空间。在你的功能1:

qs = myevent.people.order_by('-score')
mylist = list(qs.all())
....do up date....
cache.set(cache_key, mylist)

答案 1 :(得分:1)

有一件事从您的示例代码中跳出来。您似乎将缓存视为可靠的数据存储区。你永远不应该假设缓存会返回一个值。

当你得到my_cache_list时,

None可能是TypeError,这意味着找不到缓存密钥。您应该始终测试None值并重新生成值。

当您使用备份的memcache时,您需要记住,您只能存储最大1MB的值。大于此值的值将被无声地丢弃。

答案 2 :(得分:-1)

在缓存中设置之前尝试挑选列表:

import cPickle as pickle

cache.set(pickle.dumps(mylist))


function(2):
    my_cache_list = cache.get(cache_key)
    newlist = sorted(pickle.loads(my_cache_list),key=operator.itemgetter('score'), reverse=True )