2

不确定这是否是 django 中的错误,或者我从错误的角度接近这个问题。

我需要运行一个查询,以返回所有“站点”模型对象以及通过外键与站点模型对象相关的其他一些模型对象。

为此,我运行:

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。

4

0 回答 0