ユーザーのWebページで、クラス "ModelClass"のインスタンスに関する一般的な統計情報を表示したいとします。数千のModelClassオブジェクトがあり、計算に必要な統計量が多いとします。私はモデルマネージャでこれを行うことができますことを考え出し、ここで(非常に)簡単な例でいる:データベースへのdjangoモデルマネージャーの結果の保存
class ModelClassCustomManager(models.Manager):
def get_query_set(self):
return super(ModelClassCustomManager, self).get_query_set().filter(is_complete = True)
class ModelClass(models.Model):
is_complete = models.BooleanField(default = False)
...
objects = models.Manager()
complete_objects = ModelClassCustomManager()
私の関心は、ユーザーがページを表示するときに、これが計算されている場合、これは多くのリソースを消耗ということです。したがって、統計が実際に変更される唯一の時間なので、新しいModelClassオブジェクトを変更または作成する場合にのみ計算したいと思います。これはModelClassのsave()メソッドをオーバーライドすることで行うことができます。
これらの結果を保存するにはどうすればよいですか?計算された統計を保持するための別のジャンゴモデルを作成すべきか、あるいはこの情報を格納する別の方法がありますか?
編集:良い答えのためにpastylegsに感謝します。しかし、このようにすると、いくつかの小さなバグが発生します。誰かがこの問題に遭遇した場合、私はここで説明します。
まず、ModelClassにインポートを誤って入れてしまったので、私は循環依存性を得て、奇妙な結果を得ました。あなた自身の不満を救うために、pastylegsがしたところに置いてください。第二に、これだけで
if sender is ModelClass and instance is not Null:
count = ModelClass.objects.all().count()
stat = Stat(name='some_name', value=count).save()
を置き換え、(新しいものを毎回作成していない)、統計の以前の計算を上書きするために:私はアプリを作成したい
if sender is ModelClass:
count = Match.objects.all().count()
try:
stat = Stat.objects.get(key="Total")
stat.update(key="Total", value=count) #Update statistic
except:
Stat(key="Total", value=count).save() #Create new
素晴らしい答え!これは非常に良いやり方で、まさに私が探していたものです。ありがとう@pastylegs。 – grenadejumper