TypeError无法pickle函数对象(Django缓存)

2024-04-18 18:51:48 发布

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

为什么第一个示例抛出TypeError (can't pickle function objects),而第二个示例没有抛出,我想这与QuerySet求值(django1.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

^{pr2}$

如果我将foo设置为list comprehension,则可以:

foo = [obj for obj in Foo.objects.annotate(bar_count=Count('bar')).filter(bar_count__gte=1)]

Tags: 示例cachegetreturnobjectsfoocountbar
1条回答
网友
1楼 · 发布于 2024-04-18 18:51:48

Queryset不是结果对象的列表。它是一个延迟计算的对象,在您第一次尝试读取其内容时运行其查询。但是当您从控制台打印它时,它的输出与对象列表相同。所以大多数人认为它们是简单的列表。在

在第二个示例中,您正在将queryset转换为列表。这就是为什么它有效。你也可以这么做

foo = list(Foo.objects.annotate(bar_count=Count('bar')).filter(bar_count__gte=1))

它也会起作用的。在

如果以后不需要它们作为Foo对象。我建议使用值或值列表运算符。这将提供更快的结果和更小的内存占用。(http://www.yilmazhuseyin.com/blog/dev/django-orm-performance-tips-part-2/

相关问题 更多 >