如果我对查询集执行prefetch_related('toppings')
查询,并且我想稍后filter(spicy=True)
按相关表中的字段,Django 会忽略缓存的信息并执行数据库查询。我发现这是记录在案的(在注释框下),并且似乎在执行select_related()
另一个缓存时发生在所有形式的缓存(、已经评估的查询集等)filter()
上。
但是,是否有某种超级秘密隐藏的省时快捷方式可以在本地过滤(使用缓存而不是访问数据库)而无需编写 python 代码来循环查询集(使用列表/字典理解等)?也许像一个filter_locally(spicy=True)
?
编辑:
列表/理解对我来说效果不佳的原因之一是因为列表/字典没有查询集方法。就我而言,第一级 M2M 字段toppings
不是我的最终目标,我需要检查第二个相关的 M2M 字段(我也已经预取了)。虽然使用列表推导也可以做到这一点,但使用以下内容要简单得多,filter_locally(spicy=True, origin__country='Spain')
因为:
- 它允许以最小的努力访问多个级别的相关字段
- 它允许链接其他查询集方法
- 它更容易阅读,因为它与熟悉的一致
filter()
- 使用不预取来修改现有代码更容易
filter()
,无需太多更改即可添加此优化。
但从回复来看,Django 没有这样的支持:(