web-dev-qa-db-ja.com

Django:変更されないエントリのキャッシュプロパティ

次のことを行うのが良いアイデアかどうか私は思っています:

私は、Django=モデル(移行に関連しているため、データベースエントリを持っています)に一連のプロパティがあります。これらにアクセスすると、毎回データベースにアクセスしていることは明らかです。

私はまた、これらのプロパティを使用する多くのメソッドを持っています:

_def is_good(self):
  return not self.bad and self.good > self.threshold
_

そして、これらの方法はかなり頻繁に使用されます。パフォーマンスのために、データベースクエリをできるだけ減らすようにしています。

モデルが非常に「静的」であるという事実を利用できるかもしれません。つまり、これらの属性のほとんどは実際には値を変更しないため、_self.bad_または_self.good_および_self.threshold_は- always同じ値を保持し、データベースで変更されることはありません。おそらく私はこれを私の利点に使用し、is_good()をキャッシュしてデータベースの作業を減らすことができますか?

_def is_good(self):
  try:
    return self._is_good
  except AttributeError:
    self._is_good = not self.bad and self.good > self.threshold
  return self._is_good
_

これは一般的で推奨される方法ですか?

3
dabadaba

Djangoにはcached_propertyユーティリティが含まれています。それはあなたのメソッドをプロパティに変えます(それが属性であるかのように読むことができます)が、メソッドが最初に実行された後、それはその戻り値に置き換えられるので、それ以降はその値を持つ単なる属性になります:

from Django.utils.functional import cached_property

@cached_property
def is_good(self):
    return not self.bad and self.good > self.threshold

これで、instance.is_goodなしで()として使用できます。それ以外の場合は、少し速く、醜い_is_good属性を必要とせずに、期待どおりに機能します。

そうは言っても、あなたの例のメソッドはおそらくかなり早く実行されると思います。

Djangoでキャッシュを行う方法は他にもたくさんあります キャッシュフレームワークのドキュメント を参照してください。

1
RemcoGerlich