Hed*_*ide 2 python django caching django-orm django-cache
为什么第一个示例抛出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')
Run Code Online (Sandbox Code Playgroud)
例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')
Run Code Online (Sandbox Code Playgroud)
如果我用列表理解设置foo它可以工作:
foo = [obj for obj in Foo.objects.annotate(bar_count=Count('bar')).filter(bar_count__gte=1)]
Run Code Online (Sandbox Code Playgroud)
Queryset不是结果对象的列表.当您第一次尝试读取其内容时,它是一个延迟评估的对象,它会运行查询.但是当您从控制台打印时,其输出与对象列表相同.所以大多数人认为它们是简单的列表.
在第二个示例中,您将查询集转换为列表.这就是它的工作原理.你也可以这样做
foo = list(Foo.objects.annotate(bar_count=Count('bar')).filter(bar_count__gte=1))
Run Code Online (Sandbox Code Playgroud)
它也会起作用.
如果以后你不再需要它们作为Foo对象.我建议使用values或values_list运算符.这将提供更快的结果和更小的内存占用.(http://www.yilmazhuseyin.com/blog/dev/django-orm-performance-tips-part-2/)
归档时间: |
|
查看次数: |
3240 次 |
最近记录: |