私はDjango 1.8(pytestを使用)を使用しており、次の構成を持っています:
- およびによって管理されるデータベース
default
で、読み取り操作か書き込み操作かに応じて、DB 呼び出しをいずれかの接続に転送します。readonly
MasterSlaveRouter
- 私の開発環境では、
settings.DATABASES
ディクショナリの両方のエントリが同じ設定になっています (異なる接続を使用しているだけですが、データベースは同じです)。 default
ただし、私のテスト環境にはデータベースしかありません。- モデルが保存さ
post_save
れるたびにシグナルが発生します。Foo
- インスタンス
@transaction.atomic
を変更して 2 回呼び出すアトミック操作 ( で装飾) があります。デコレータにはカスタムパラメータが渡されないため、トランザクションはデータベース上でのみアクティブになります。Foo
.save()
using
default
post_save
コールバックは を指すBar
レコードを作成しますが、これを含むレコードが既に存在するかどうかを確認した後でのみです( を避けるため)。このチェックは、次のクエリを実行することによって行われます。OneToOneField
Foo
Bar
foo_id
IntegrityError
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
辞書 ( default
test_settings からのみのもの) がキャッシュされ、変更setting.DATABASES
しても新しい値にアクセスできなくなります。
特定のテストのデータベース構成を適切にオーバーライドするにはどうすればよいですか?