4

現在、django アプリケーションのテストを書いています。残念ながら、複数のデータベース レイアウトを使用する必要があり、これを変更することはできません。(複数のデータセンターにまたがる異なるサーバーに複数のバックエンドを持つ分散データベース)

2 つのデータベースがあります。

  1. django のデフォルト テーブルを持つデフォルト データベース
  2. 一部のモデルを含むアプリケーション データベース

これらのモデルについては、django サイトに記載されているようなさまざまなルーターを作成しました。問題は、python manage.py test customerreceipts を実行すると、テスト フレームワークが数秒後に次のエラーで停止することです。

django.db.utils.ProgrammingError: relation "auth_user" does not exist

作成したデータベースを確認したところ、テーブルがありませんでした。このため、モデルからのクエリはエラーをスローします。

問題のモデルは次のとおりです (データベース 2 内):

class CustomerReceipts(models.Model):

    def _choices_user():
        users = User.objects.all()
        users = users.order_by('id')
        return [(e.id, e.username) for e in users]

    # General
    receipt_name = models.CharField(max_length=20, verbose_name="Receipt name")  #: Receipt name
    ....

    # Auditing
    owner = models.IntegerField(verbose_name="Owner", choices=[('', '')] + _choices_user())

複数データベースのセットアップは直接リンクをサポートしていないため、所有者には IntegerField を使用し、ビジネス ロジックが整合性を処理します。

問題は、欠落しているテーブルのクエリを設定する _choices_user() です。私が理解していないのは、最初の実行でdjangoがテーブルauth_userを作成しない理由です。原因となっているモデルのアプリを削除すると、テスト フレームワークは問題なく動作しています。

これを修正する方法はありますか?

ありがとう!

編集:1つのデータベース設定を作成し、同じことを試しました. 悲しいことに、同じエラーがスローされます。今、混乱しています。誰かがこれもテストできますか?_choices_user メソッドでモデルを作成し、テストを実行します。

4

2 に答える 2

1

データベースを手動で選択できます。using() を呼び出すだけです。メソッドusing()は単一の引数を取ります: クエリを実行したいデータベースのエイリアスです。

def _choices_user():
    users = User.objects.using('default').all()
    .....
    .....

ジャンゴ 1.7 ドキュメント

于 2015-01-02T16:09:48.567 に答える