【发布时间】:2012-09-08 09:37:35
【问题描述】:
为什么第一个示例抛出TypeError (can't pickle function objects) 而第二个没有,我想这与 QuerySet 评估(Django 1.4)有关?
def get_or_set_foo_cache():
if not cache.get('foo'):
foo = Foo.objects.annotate(bar_count=Count('bar')).filter(bar_count__gte=1)
print type(foo) # prints <class 'django.db.models.query.QuerySet'>
cache.set('foo', foo, 60 * 15)
return foo
return cache.get('foo')
示例 2
def get_or_set_foo_cache():
if not cache.get('foo'):
foo = Foo.objects.all()
print type(foo) # prints <class 'django.db.models.query.QuerySet'>
cache.set('foo', foo, 60 * 15)
return foo
return cache.get('foo')
如果我将 foo 设置为列表理解,它会起作用:
foo = [obj for obj in Foo.objects.annotate(bar_count=Count('bar')).filter(bar_count__gte=1)]
【问题讨论】:
-
你到底在腌什么?当您调用示例 2 时,您确定
cache没有foo吗? -
那是哪个版本的 Django?
-
如果我尝试直接设置缓存,我什至会收到此错误,例如cache.set('foo', Foo.objects.annotate(bar_count=Count('bar')).filter(bar_count__gte=1))
标签: python django caching django-orm django-cache