私の Django アプリには、johnny-cachePage
を使用してキャッシュしている更新頻度の低いモデルのセットと、別のキャッシュ体制を実装した別の頻繁に更新されるモデル ( と呼ばれる) があります。
ホワイトリストに登録されたモデルのいくつかには、 との外部キー関係がありPage
ます。の更新時にホワイトリストに登録されたモデル キャッシュのどれを無効にする必要があるかを知っているPage
ので、特定の操作が で実行された後にキャッシュを明示的に無効にする一連のシグナル ハンドラーを実装しましたPage
。
しかし、 johnny-cachePage
は、更新操作のたびに外部キー関係を持つモデル キャッシュを自動的に無効にしていることに気付きました。この方法(johhny.cache
)が問題のようです:
def invalidate(self, instance, **kwargs):
if self._patched:
table = resolve_table(instance)
if not disallowed_table(table):
self.keyhandler.invalidate_table(table)
tables = set()
tables.add(table)
try:
instance._meta._related_objects_cache
except AttributeError:
instance._meta._fill_related_objects_cache()
for obj in instance._meta._related_objects_cache.keys():
obj_table = obj.model._meta.db_table
if obj_table not in tables:
tables.add(obj_table)
if not disallowed_table(obj_table):
self.keyhandler.invalidate_table(obj_table)
最後のセクションでは、更新中のテーブルに関連するすべてのテーブルをループし、self.keyhandler.invalidate_table(obj_table)
ホワイトリストに登録されているすべてのテーブルを呼び出します。
ホワイトリストに登録されていないテーブルへのすべての変更を無視するように johnny-cache に指示するために使用できる構成はありますか? または、次のように関数を変更する必要がありますか:
...
if not disallowed_table(table):
self.keyhandler.invalidate_table(table)
else:
return
...
効果的だが醜いのはどれ?