2

Djangoアプリケーションにこのようなコードのスニペットがあります

def update_account(user_account,add_widget_count):
    user_account.add_widgets(add_widget_count)
    user_account.save()

    notify_other_system_about_account_update(user_account)

これをアプリケーションの一部として実行すると、すべてがうまく機能します。特に、他のシステム (django の外部) が通知を受け取ると、データベースがチェックされ、ウィジェット数が更新されます。

ただし、管理 Web サイトから上記のコードを実行すると、問題が発生します。他のシステムが通知を受け取ると、データベースに更新された値が表示されません。ブレークポイントを配置してデータベースをチェックインすることで確認しましたが、.save() の呼び出し後に更新されません。非管理サイト呼び出しでは、このブレークポイント中にチェックすると DB が更新されます。アプリにコースを実行させた後でのみ、DB が更新されます。

django admin ミドルウェアは、OD DB の書き込みを何らかの遅延または延期していますか?

アップデート

notify_other_system_about_account_update(user_account)UserAccount オブジェクトの post_save シグナル ハンドラーへの呼び出しも移動しました。信号が発火しますが、それを取得すると。シグナル ハンドラが返された後、ある時点でデータベースが更新されます。この動作は、管理 Web サイト内から実行している場合にのみ発生します。

4

1 に答える 1

4

問題が見つかりました。django 管理者は、ビュー全体の DB トランザクションを使用します。外部システムに通知する前に、手動でトランザクションをコミットする必要があります

于 2009-06-14T15:05:28.920 に答える