これが 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 ルックアップを取得すると、そのクエリセットのキャッシュが失敗することです。さらに、クエリセット (例: company.site_set.filter(...)) で _set を実行すると、これも失敗します。
サイト モデルにリンクするオブジェクトの直接参照がないことと関係があると思いますが、すべての基礎となるメカニズムを理解することは役に立ちます。
誰かがこれに光を当てることができますか? 私は本番環境で memcached を使用しています。