Django 1.5からDjango 1.10に移行し、コミットおよびロールバック制御がほとんどなく、データベーストランザクションが全く異なることを発見しました。Django 1.10:メイントランザクションのフェイル/ロールバック後にデータをログテーブルにコミットする
私が欲しいもの:Djangoの1.5では
Perform series of queries in view: my_function(request)
If all queries succeed:
commit
if any query fails:
rollback
insert into log table and commit the insertion
、私はロールバックしてこれを処理し、例外ミドルウェアにコミット:
class ExceptionMiddleware(object):
def process_exception(self, request, exception):
# do rollback
# insert into log table
# commit
どのように私は「はdoesnのジャンゴ1.10でこれを達成することができますロールバックを行う方法と思われますか?
マイ1.10設定:
AUTOCOMMIT = True
ATOMIC_REQUESTS = True
これは正しく、唯一の完了時にコミットし、1つのトランザクションにすべてのクエリを置きます。
"AUTOCOMMIT = False"でさらにロールバック/コミット制御ができますが、Djangoはこれに対して次のように推奨しています。 "これは、独自のトランザクション制御ミドルウェアを実行するか、
例外がtransaction.atomic()
の
__exit__
メソッドを介して伝播される
from django.db import transaction
class LoggingMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
try:
with transaction.atomic():
response = self.get_response(request)
except:
log_failure()
raise
return response
は、トランザクションは自動的にロールバックされます。Djangoの1.10
はい、これを使用します –