1

複数のmy_model.save()場所で (条件付きで) 単一のオブジェクトを呼び出す Django ビューがあります。通常のモデルクラスです。my_model

save()Django では一度に commit するため、最悪の場合、データベースが数回ヒットします。これを防ぐために、ブール変数を定義し、オブジェクトの変更の場合にsave_model設定しました。Trueビューの最後で、このブール値をチェックsaveし、必要に応じてオブジェクトを呼び出します。

これを行う簡単な方法はありますか?ビュー デコレータとしてDjangos を試してみtransaction.commit_on_successましたが、保存呼び出しはキューに入れられてコミットされたように見えます。

4

3 に答える 3

2

django-dirtyfieldsを調べることができます。

DirtyFieldsMixinモデルへのミックスインとして使用するだけです。obj.is_dirty()を実行する前に、( を使用して) オブジェクトが変更されたかどうかを確認できますsave()

于 2012-05-28T09:06:23.573 に答える
2

コードのどこでもトランザクションサポートを使用できます.Djangoのドキュメントはそれを明示的に述べています:

以下の例ではビュー関数を例として使用していますが、これらのデコレーターとコンテキスト マネージャーは、トランザクションを処理する必要があるコード内の任意の場所で使用できます。

しかし、これはトランザクションの目的ではありません。django-dirtyfieldsなどの既存のアプリを使用して、ブール変数を取り除くことができます。

しかし、それは悪いデザインのようなにおいがします。なぜ何save度も電話する必要があるのですか?一度だけ呼び出す方法はありませんか?

于 2012-05-28T09:05:32.373 に答える
0

これには2つのアプローチがあります...しかし、それらは似ています...最初の1つは、save()応答を返す前に呼び出すことです。

def my_view(request):
    obj = Mymodel.objects.get(...)
    if cond1:
        obj.attr1 = True
    elif cond2:
        obj.attr2 = True
    else:
        obj.attr1 = False
        obj.attr2 = False
    obj.save()
    return .......

2つ目はあなたのアプローチです...

ただし、独自のデコレーターを定義するか、他のアプローチを行う以外に、これを行う方法は他にありませんが、実際には、モデルに変更があるかどうかを確認する必要があります (または変更をデータに保存する必要があります)。

于 2012-05-28T09:08:36.287 に答える