2009-05-08 19 views
2

データベースレコードを読み込んで変更して保存したDjango管理者が2人(またはそれ以上)あるとします。データベースの問題はありませんが、管理者によっては、書き込んだレコードが上書きされたことに驚くことがあります。djangoの管理で書き込み競合を回避するにはどうすればよいですか?

この問題はこれまでに解決されていますか? 1つの方法は、レコード内にフラグを設定する明示的な「編集中」ボタンを設けることです。別の管理者が同じレコードを読み込んで「編集中」をクリックすると、進行中の編集があることが警告されます。レコードを保存するときにインクリメントされるレコードにフィールドを追加することもできます。レコードが読み込まれたときとフィールドが異なる場合、管理者は、レコードを読んだ後、他の誰かによってレコードが変更されたことを管理者に警告します。

これを処理するネイティブなジャンゴの方法はありますか?

+0

良い質問ミッチ。残念ながら、このような機能はないと私は恐れています。 –

答えて

2

Django管理者は、そのままの形で書き込み競合の保護を実装していません。それを自分で追加するのは難しくありません。個人的には、私は "バージョン番号フィールド"アプローチを採用します。

+0

django-concurrencyは、まさにこのためのメカニズムを提供します:https://django-concurrency.readthedocs.org/en/latest/index.html – GrantJ

0

一般的に、これは、データベースのトランザクション分離機能を読み取る場所です。その理由は、トランザクション分離機能があるためです。

実際にそうしたくない場合は、アプリケーションレイヤーでこれを行うためのさまざまなパターンが存在しますが、それを行う標準的な方法はありません - 一部の人々が一種の「最終アクセス」タイムスタンプを設定し、それ以降の一定期間の編集を許可する、他のバージョン番号を設定するなど

+0

Erm ...何?別々のHTTPリクエスト間でDBトランザクションを維持することを本当に提案していますか?それ以外の場合、DBトランザクションは「2人の管理者が同じ管理者ページを読み込み、1つの保存者が他の管理者ページを上書きします」という回答は表示されません。データベースは、孤立したトランザクションをうまく管理し、最後に保存した人によって保存された状態を保存することを忠実に指示します。ここでは、アプリケーションレベルのソリューションしか使用できません。 –

関連する問題