pre_save, save, post_save
モデル インスタンスが保存されたときに、必要なことを行うように オーバーライドまたは定義できることがわかりました。
どの状況でどちらが優先され、その理由は何ですか?
pre_save, save, post_save
モデル インスタンスが保存されたときに、必要なことを行うように オーバーライドまたは定義できることがわかりました。
どの状況でどちらが優先され、その理由は何ですか?
例を挙げて説明するために最善を尽くします。
pre_save
およびモデルによって送信されるpost_save
シグナルです。save
簡単に言えば、モデルが呼び出される前または後に実行するアクションです。
Asave
は次のステップをトリガーします
Django は、これらのシグナルをオーバーライドする方法を提供しています。
今、
pre_save
データベースへの実際の保存が行われる前に、何らかの処理のためにシグナルをオーバーライドすることができます - 例:(pre_save
私の頭の中で理想的な場所の良い例がわかりません)
まだ編集されていないModelA
すべてのオブジェクトへの参照が格納されているとします。このために、のメソッドが呼び出される直前に通知するシグナルを登録できます (ここでもシグナルの登録を止めるものは何もありません)。ModelB
pre_save
ModelA
ModelB
save
post_save
ここsave
で、モデルのメソッド (シグナルではない) が呼び出されます。デフォルトでは、すべてのモデルにsave
メソッドがありますが、オーバーライドできます。
class ModelB(models.Model):
def save(self):
#do some custom processing here: Example: convert Image resolution to a normalized value
super(ModelB, self).save()
次に、post_save
信号を登録できます(これはより使用されますpre_save
)
一般的なユースケースは、システムでオブジェクトが作成されるUserProfile
ときUser
のオブジェクトの作成です。
システム内のすべてに対応するオブジェクトpost_save
を作成するシグナルを登録できます。UserProfile
User
シグナルは、物事をモジュール化して明示的に保つ方法です。ModelA
( isave
または何かを変更した場合は明示的に通知しますModelB
)
この質問によりよく答えるために、より具体的な実例を考えてみます。それまでの間、これがお役に立てば幸いです
pre_save
トランザクションが保存される前に使用されます。
post_save
トランザクションが保存された後に使用されます。
pre_save
たとえば、 または がある場合に使用してFileField
、またはが実際に存在するかImageField
どうかを確認できます。file
image
を持っていて、新しいものが作成された瞬間に新しいものを作成したいpost_save
場合に使用できます。UserProfile
User