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

2024-03-02 20:39:35 发布

您现在位置:Python中文网/ 问答频道 /正文

您好

一些简单的东西(django 1.2.3,python2.6,memcached)。在

我有一个函数,我首先做一个有点贵的查询,当我做这个查询时,我做一个order\u 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 )

基于其他帖子,我认为这应该行得通,但我得到一个类型错误,说我的缓存列表不可订阅。在

有人有什么想法吗?我可能在做蠢事。。。。在

谢谢。在

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


Tags: djangokey函数cachebymy错误order
3条回答

在将列表放入缓存之前,请尝试对其进行pickle处理:

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 )

Python函数sorted()可以处理可变列表类型,而Django查询集则不是这样:这就是您得到的错误基本上告诉您的。从技术上讲,订阅是通过列表元素的索引访问列表元素的行为,如下所示:

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

如果在queryset上尝试此操作,它将失败,并出现与您相同的异常:

^{pr2}$

如果您想保持加载有序查询集、缓存结果并在缓存访问时重新排序的方案,则必须将查询集转换为实际列表并将其存储在缓存中(不过,这将占用更多的缓存空间)。在函数1中:

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

你的代码就是这样跳出来的。你似乎把你的缓存当作一个可靠的数据存储。永远不要假设缓存将返回值。在

当您获得TypeError时,my_cache_list可能是{},这意味着没有找到缓存密钥。您应该始终测试None值并重新生成该值。在

当您使用memcache时,需要记住的是,您只能存储最大为1MB的值。大于此值的值将被自动丢弃。在

相关问题 更多 >