今川館

都内勤務の地味OLです

Djangoのtransaction配下のモジュールはデコレータでありコンテキストマネージャであった!

Djangoトランザクション制御するときに使うデコレータ

Djangoトランザクション制御するときは、django.db.transaction配下にある

  • commit_on_success
  • commit_manually

こういうデコレータを使います。

from django.db import transaction


@transaction.commit_on_success
def save_data(cls, values):
    obj = cls(**values)
    obj.save()

こんなやつですね。

transaction配下のデコレータ達は実はwith文でも使えた!

これを知らなかったわけですが、このcommit_on_successとかはデコレータだけでなく、コンテキストマネージャでもあるので、with文でも使えるのです。

from django.db import transaction

from apps.user.models import User


def main():
    with transaction.commit_on_success(using="master"):
        user = User(id=1, name="easy", age=13)
        user.save()
    print("ok")

こんな風にも使えるんですね。
この場合、withブロックを出たときに例外がでなかったらcommit、出たらrollbackされるようになります。

これはよくできていると思いました。