ジャンゴ - キャッシュされたフィールド高価なツー計算データのためのDjangoのORMにセロリ-据え置き、キャッシュされたフィールドを提供Djangoのアプリです
DjangoのORMとセロリを使用して、高価なツー計算キープ最新の属性。
の例の
あなたがあなたのモデルの一つに遅いメソッドを持って言う:
クラス街灯柱(models.Model):
  @property
 デフslow_full_name(自己):
 スリープ(30)
 戻り '%S%S%sの'%(self.weight、self.first_name、self.country)
うわ。遅すぎる。のはそれをキャッシュしてみましょう。我々はいくつかのツールをお勧めします。ジャンゴ-セロリとセロリは
django_cached_field輸入CachedIntegerField、ModelWithCachedFieldsから
クラス街灯柱(models.Model、ModelWithCachedFields):
  slow_full_name = CachedTextField(ヌル=真)
 デフcalculate_slow_full_name(自己):
 スリープ(30)
 戻り '%S%S%sの'%(self.weight、self.first_name、self.country)
(うん、calculate_は単なる慣習である。私ははっきりとレールの幽霊をあきらめていません...)
次に、南使用して新しいキャッシュされたフィールドを含むようにDBスキーマを移行したり、独自のロール。 2つのフィールドは、おそらくtrueに不履行、このテーブル、text型のcached_slow_full_nameに追加され、boolean型slow_full_name_recalculation_neededされることに注意してください。
すでにそれはちょっとはましだ。 lamppost.slow_full_nameは30秒にそれが与えられたレコードに対して呼び出される最初の時間がかかることがありますが、それ以降、それは近い瞬間でしょう。もちろん、この時点では、その最初の呼び出し後に変更することはありません。
パズルの残りの重要な部分は、私たちのキャッシュを無効にすることです。 Thoses構成フィールドは、おそらく(これは、関連する値が更新された場合に気付いについてもっと賢いかもしれない)いくつかのviews.pyに変更されます。
@render_to(「街灯/ edit.html」)
DEF編集(リクエスト、lamppost_id):
 街灯= Lamppost.objects.get(PK = lamppost_id)
 てrequest.method == 'POST'の場合:
 フォーム= LamppostForm(request.POST)
 )(form.is_validた場合:
  form.save()
  form.instance.flag_slow_full_name_as_stale()
&NBSP、そうでない:
 フォーム= LamppostForm()
 戻り{'形':フォーム、「街灯 ':街灯柱}
これは開発者として最も難しい部分です!キャッシングは、値は変更されている場合もすべての場所を追い詰めるとそのflag_slow_full_name_as_staleメソッドを呼び出す必要があります。国はcron'o'clock毎朝ランダムに新しい値を割り当てていますか?そのフラグは、最高のcron'o'oneによって古くなっていた。あなたは、関連するすべてのハトの合計に基づいて重量を計算していますか?ハトの着陸にフック。そして、離陸。そして、個々のハトの体重を変更し、すべて。エイブラハム·リンカーンが言ったように、「唯一つのハードプログラミングでの問題があります。名前付け、キャッシュの無効化とオフ·バイ·1のエラーは "
<強い>インストールの
あなたは自分で物事を簡単に行うことができます。
ジャンゴ - キャッシュされたフィールドをインストールピップ
または、手動インストールのために、あなたはレポのクローンを作成し、Pythonとsetup.pyを使用してインストールすることができます。
gitのクローンgitの://github.com/aquameta/django-cached-field.git
CDジャンゴ - キャッシュされたフィールド/
Pythonはsetup.py installを
ジャンゴ1.3.1、セロリ2.3.1、ジャンゴ-セロリ2.3.3でテストされています。
のコンフィグレーションの
つの設定の変更はほとんど仕事をする事に必要です。セロリはそのタスクファイルを見ていることを確認し、それは、登録アプリのことを確認してください:
INSTALLED_APPS + = ['django_cached_field'、]
CELERY_IMPORTS + = ['django_cached_field.tasks'、]
一つの変化はオプションです。古くなった(デフォルト)としてフラグまたは属性がアクセスされ、次回に委ねられるとき再計算が発生するかどうかを指定します。これは、あなたのキャッシュされた値が無効であることを気にしないテスト環境に便利です。このような状況で、あなたはセロリを必要としないことに注意してください。
CACHED_FIELD_EAGER_RECALCULATION = TRUE#またはテスト環境用の偽
これはグローバルオプションであるため、個々の例外ではなくflag_FIELD_as_stale呼び出しにand_recalculate引数を渡すことで処理する必要があります。
の注意事項の
- 競合状態はセロリジョブが呼び出されるのにかかるよりも完了に時間がかかりDBトランザクションのように、古くなったフィールドにフラグをした場合。
- すべてのORMの方法(例えばORDER_BY、フィルタ)cached_FIELDを使用する必要があります。
- recalculate_FIELDは値を設定する=(cached_FIELD .updateを使用しています。
- flag_FIELD_as_staleは、同様に、.updateを使用しています。
の要件の
- のPythonます。 。
- ジャンゴます。
コメントが見つかりません