私はDjango 1.8(pytestを使用)を使用しており、次の構成を持っています:
- およびによって管理されるデータベース
defaultで、読み取り操作か書き込み操作かに応じて、DB 呼び出しをいずれかの接続に転送します。readonlyMasterSlaveRouter - 私の開発環境では、
settings.DATABASESディクショナリの両方のエントリが同じ設定になっています (異なる接続を使用しているだけですが、データベースは同じです)。 defaultただし、私のテスト環境にはデータベースしかありません。- モデルが保存さ
post_saveれるたびにシグナルが発生します。Foo - インスタンス
@transaction.atomicを変更して 2 回呼び出すアトミック操作 ( で装飾) があります。デコレータにはカスタムパラメータが渡されないため、トランザクションはデータベース上でのみアクティブになります。Foo.save()usingdefault
post_saveコールバックは を指すBarレコードを作成しますが、これを含むレコードが既に存在するかどうかを確認した後でのみです( を避けるため)。このチェックは、次のクエリを実行することによって行われます。OneToOneFieldFooBarfoo_idIntegrityError
already_exists = Bar.filter(foo=instance).exists()
post_saveこれは、コールバックが初めて呼び出されたときに問題ありません。Barレコードが作成され、すべて正常に動作します。ただし、2 回目は、そのようなBarインスタンスが前回のFoo保存で作成されたばかりであっても、フィルタリングは読み取り操作であるため、readonly接続を使用して実行already_existsされ、結果として値が含まれてしまいFalse、新しいレコードの作成がトリガーされます。これは最終的に IntegrityError をスローします。これは、作成操作がdefault接続で実行されると、そのfoo_id.
DATABASESディクショナリを dev_settings から test_settings にコピーしようとしましたが、これにより多くのテストが失敗しました。次に、デコレータについて読んoverride_settingsで、自分の状況にぴったりだと思いました。しかし、驚いたことに、うまくいきませんでした。ある時点で、アプリケーションが開始されると、DATABASES辞書 ( defaulttest_settings からのみのもの) がキャッシュされ、変更setting.DATABASESしても新しい値にアクセスできなくなります。
特定のテストのデータベース構成を適切にオーバーライドするにはどうすればよいですか?