4

モデルで save() を呼び出した後、データベースが同期的に更新されるという保証がないことに気付きました。

次のメソッドに ajax 呼び出しを行うことで、簡単なテストを行いました

def save(request, id)
  product = ProductModel.objects.find(id = id)
  product.name = 'New Product Name'
  product.save()

  return HTTPResponse('success')

クライアント側では、上記のメソッドからの応答を待ってから、製品のリストを取得する findAll メソッドを実行します。返された製品のリストには、更新された製品の名前の古い値が含まれています。

ただし、製品リストのリクエストを遅らせると、本来あるべきように新しい値が含まれます。

これは、新しい値がデータベースに書き込まれる前に発生した場合、HTTPResponse('success') を返すことを意味します。

上記が当てはまる場合、データベースが更新された後にのみ HTTP 応答を返す方法はありますか。

4

2 に答える 2

1

.save() 関数がそのフローを終了する前に、ビューは何も返すべきではありません。

フロー自体については、Django のドキュメントでかなり明示的に宣言されています。

オブジェクトを保存すると、Django は次の手順を実行します。

1)プリセーブ信号を発します。シグナル django.db.models.signals.pre_save が送信され、そのシグナルをリッスンするすべての関数がカスタマイズされたアクションを実行できるようになります。

2)データを前処理します。オブジェクトの各フィールドは、フィールドが実行する必要がある自動化されたデータ変更を実行するよう求められます。

ほとんどのフィールドは前処理を行わず、フィールド データはそのまま保持されます。前処理は、特別な動作を持つフィールドでのみ使用されます。たとえば、モデルに auto_now=True の DateField がある場合、事前保存フェーズはオブジェクトのデータを変更して、日付フィールドに現在の日付スタンプが含まれるようにします。(私たちのドキュメントには、この「特別な動作」を持つすべてのフィールドのリストはまだ含まれていません。)

3)データベースのデータを準備します。各フィールドは、データベースに書き込むことができるデータ型で現在の値を提供するよう求められます。

ほとんどのフィールドでは、データの準備は必要ありません。整数や文字列などの単純なデータ型は、Python オブジェクトとして「すぐに書き込む」ことができます。ただし、より複雑なデータ型では、多くの場合、何らかの変更が必要になります。

たとえば、DateField フィールドは Python の datetime オブジェクトを使用してデータを格納します。データベースには日時オブジェクトが保存されないため、データベースに挿入するには、フィールド値を ISO 準拠の日付文字列に変換する必要があります。

4)データをデータベースに挿入します。前処理され、準備されたデータは、データベースに挿入するための SQL ステートメントに構成されます。

5)保存後の信号を送信します。シグナル django.db.models.signals.post_save が送信され、そのシグナルをリッスンするすべての関数がカスタマイズされたアクションを実行できるようになります。

ビューにデコレータを適用した場合、受け取っている動作が可能であることに注意してください。@transaction.commit_on_successただし、コードには表示されません。
トランザクションの詳細: https://docs.djangoproject.com/en/1.5/topics/db/transactions/

于 2013-10-20T07:33:20.857 に答える