问候,
一些快速的东西(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。
答案 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 )