見出し画像

Django_[save_model]メソッドで、モデルの保存時の追加処理を設定する #215日目

DjangoのAdminサイトではモデルにデータを追加したり削除したりできてとても便利ですが、このデータ保存時に追加の処理を設定することも可能です。

処理内容と、それを保存するコードをそれぞれ記載します。

前後に処理を挟んで、任意のタイミングで保存するには「save_model関数」をオーバーライドすればOKです。save_modelメソッドには、オブジェクトを追加するか変更するかに基づいて、HttpRequest、モデルインスタンス、インスタンス、及びブール値が与えられます。

ModelAdmin.save_model(request, obj, form, change)

役割: 
追加や更新が発生したときに呼び出されて、変更情報をデータベースに反映させる。

https://oissypress.net/python-django-modeladmin-customization/


参考記事をもとに実際にコードを書いてみます。

[models.py]

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    update_date = models.DateTimeField('date updated')
    system_update_date = models.DateTimeField('date system_updated', auto_now=True)
[admin.py]

from . import models

# Questionモデルの保存時の処理を定義
class QuestionAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        # update_dateを現在時刻に更新
        obj.update_date = datetime.now()
        # save_model関数をオーバーライドしてデータベースに変更を反映
        super(QuestionAdmin, self).save_model(request, obj, form, change)


# Questionモデルの管理画面を設定
admin.site.register(Question, QuestionAdmin) 


ちなみにsave_model関数と似たような機能で、DBにデータを追加できるcreate()やbulk_create()があります。

save_modelは管理画面でのデータ保存に対応したadmin.ModelAdminクラスのメソッドです。対象モデルの指定は最後のadmin.site.register()で行うので、コード上でも指定していません。

対してcreate()やbulk_create()は汎用的なモデル操作のメソッドで、明示的にモデルを指定して実行しますし、例えばsave_modelに定義する処理の一つとして設定することも可能です。

また、bulk_create()は複数の更新を一括で行うためのメソッドで、1つずつcreate()するよりも遥かに高速に保存することができます。


ここまでお読みいただきありがとうございました!!


参考


この記事が気に入ったらサポートをしてみませんか?