Djangoには@transaction.commit_manually
というデコレータ機能があります。このデコレータにパラメータを渡そうとしています。(using=db)
db
は、ビジネスルールに基づいて、使用されているデータベースによって異なります。現在のデータベースをこのデコレータに渡す最善の方法は何ですか?私は内部関数を使用しようとしました:動的データベース名をデコレータに渡すにはどうすればよいですか?
しかし、これは失敗します。 pdb
で発見したエラーは、内部ブロックが「トランザクション管理下にありません」ということです。どうすればこの問題を解決できますか? pdb
から
トレースバック:
-> success = transactional_registration()
/usr/local/lib/python2.7/dist-packages/django/db/transaction.py(338)_commit_manually()
-> return func(*args, **kw)
> /home/syrion/dev/registration.py(59)transactional_registration()
-> transaction.rollback()
/usr/local/lib/python2.7/dist-packages/django/db/transaction.py(210)rollback()
-> set_clean(using=using)
/usr/local/lib/python2.7/dist-packages/django/db/transaction.py(125)set_clean()
-> raise TransactionManagementError("This code isn't under transaction management"
編集:私は私自身の問題を修正しました。内部関数の解法は正しく機能しますが、rollback()
とcommit()
をusingパラメータ(transaction.commit(using=db)
)と呼ぶ必要がありました。私は直感的ではないと思っていますが...
transaction.rollback()の後にraiseを追加して、stacktrace + fullエラーを投稿できますか? –
なぜあなたはこれをとても複雑にしていますか? 'func'が呼び出し可能なオブジェクトでないのはなぜですか? –
'func'はオブジェクト上で呼び出し可能なメソッドです。 'func'自体を飾ると、データベースは範囲外です。 – syrion