在查询中对反向外键对象使用prefetch_related时,未设置Django QuerySet缓存

时间:2013-08-28 15:16:15

标签: django caching django-queryset prefetch django-cache

不确定这是django中的错误还是我从错误的角度接近这个错误。

我需要运行一个查询,它带回所有'site'模型对象,还有一些其他模型对象,这些对象通过外键与站点模型对象相关联。

为此,我运行:

sites = Site.objects.prefetch_related(
    'tanks', 'terminals', 'statuses',
).filter(company=company, **kwargs).order_by(*ordering)

这很棒,它会在单个查询中返回与每个站点相关的所有坦克,终端和状态对象。我的问题是,如果我然后尝试缓存此查询集(从而允许用户在XLS / CSV中下载此查询集而无需执行任何其他查找),则缓存始终设置为无(即,它未设置) 。

仅当我传递与站点相关的模型名称(即反向FK)时才会发生这种情况。如果我传递的模型名称与站点相关或删除prefetch_related调用,则缓存确实成功设置。如果我这样做,那么在评估查询集时,数据库会被击中至少100次。

因此简而言之,问题似乎是在查询集上使用prefetch_related来引入反向FK查找会使该查询集的缓存失效。此外,在查询集上运行_set时也会失败(例如company.site_set.filter(...))

我认为这与链接到它的对象在站点模型中没有直接引用有关,但理解它的基础机制将是有用的。

有人能否对此有所了解?我在生产中使用memcached。

0 个答案:

没有答案