1. ホーム
  2. python

[解決済み] Djangoのシグナルとsaveメソッドのオーバーライド

2022-12-05 03:32:58

質問

私はこのことについて理解するのに苦労しています。 今、私はこのような感じのいくつかのモデルを持っています。

 def Review(models.Model)
    ...fields...
    overall_score = models.FloatField(blank=True)

def Score(models.Model)
    review = models.ForeignKey(Review)
    question = models.TextField()
    grade = models.IntegerField()

レビューにはいくつかのスコアがあり、overall_scoreはその平均値です。 レビューやスコアが保存されたとき、overall_scoreの平均を再計算する必要があります。 今はオーバーライドされた保存メソッドを使用しています。 Django のシグナルディスパッチャを使うことに何か利点があるでしょうか?

どのように解決するのですか?

保存/削除シグナルは一般に、問題のモデルに完全に固有でない変更を行う必要がある場合、または共通の何かを持つモデルに適用できる場合、またはモデル間で使用するように構成できる場合に好都合です。

オーバーライドされた1つの共通のタスクは save メソッドにおける共通のタスクは、モデル内のいくつかのテキストフィールドからのスラッグの自動生成です。これは、もしあなたが多くのモデルのためにそれを実装する必要があるのであれば、そのようなものの一例です。 pre_save シグナルを使用することが有益で、シグナルハンドラはスラッグフィールドの名前とスラッグを生成するフィールドの名前を受け取ることができます。一旦そのようなものを設置すれば、設置した拡張機能はすべてのモデルにも適用されます - たとえば、一意性を確保するために、問題のモデルのタイプに追加しようとしているスラッグを検索します。

再利用可能なアプリケーションは、しばしばシグナルの使用から恩恵を受けます。提供する機能がどのモデルにも適用できる場合、一般的に(避けられない場合を除き)ユーザーはその恩恵を受けるためにモデルを直接修正する必要がないことを望みます。

とは django-mptt を使う場合、例えば pre_save シグナルを使って、作成または更新されようとしているモデルのツリー構造を記述するフィールドのセットを管理し、さらに pre_delete シグナルは、削除されるオブジェクトとその前のオブジェクトのサブツリー全体のツリー構造の詳細を削除し、それらが削除されるようにします。シグナルの使用により、ユーザは追加または修正することなく save または delete メソッドで管理できるようにするには、django-mptt にどのモデルを管理させたいかを 知らせるだけでよいのです。