1

いくつかのスクリプトで次のユーティリティ関数を使用しています。

@transaction.commit_on_success
def save_something(arg):
    # creation of a model_instance using arg
    model_instance.save()

スクリプトの1つで、これらのモデルインスタンスの多くをデータベースにアップロードします。これを効率的にするために、私は次のことを試みます。

@transaction.commit_manually
def save_many(arg_list):
    for i,arg in enumerate(arg_list):
        save_something(arg)
        if i%1000==0:
            transaction.commit()

commit_manuallyオーバーライドしますcommit_on_successか?
そうでない場合、どうすればそれを作ることができますか?

4

3 に答える 3

1

このスニペットを見てください。ネストされたコミットをより適切に処理していると思います http://djangosnippets.org/snippets/1343/

于 2012-03-28T17:59:23.447 に答える
0

簡単な答えは「いいえ」と「できません」です。デコレータ(および実際に実行できるすべての機能)は、デコレータが装飾する関数を、必要に応じてトランザクションを開始し、元の関数を呼び出す別の関数でラップすることです。commit_manuallyデコレータのラッパー関数が行うのはこれだけです。デコレータはcommit_on_success、ラップされた関数の成功に応じて、自動コミットまたはロールバックを追加します。デコレータは、切り替えられ、他の動作がキーオフされる「ランタイムフラグ」ではありません。それらは単に関数を包み込む小さな定型文であり、commit_on_successデコレータの定型文は常にコミットまたはロールバックします。

デコレータのソースから、手元にある詳細について詳しく知ることができます:https ://code.djangoproject.com/svn/django/trunk/django/db/transaction.py

于 2012-03-26T09:41:27.947 に答える
0

あなたはできる:

@transaction.commit_on_success
def save_something(arg):
    _save_something(arg)

def _save_something(arg):
    # creation of a model_instance using arg
    model_instance.save()

そして、デコレータを無料で使用する必要_save_something()ある単一のケースでは、 ...を使用します

于 2012-03-26T09:44:23.583 に答える