web-dev-qa-db-ja.com

InvalidBasesError:[<ModelState: 'users.GroupProxy'>]のベースを解決できません

テストを実行すると、データベースの初期化中にこのエラーが発生します。

Django.db.migrations.state.InvalidBasesError: Cannot resolve bases for [<ModelState: 'users.GroupProxy'>]
This can happen if you are inheriting models from an app with migrations (e.g. contrib.auth)

Django admin:

class GroupProxy(Group):
    class Meta:
        proxy = True
        verbose_name = Group._meta.verbose_name
        verbose_name_plural = Group._meta.verbose_name_plural

では、この問題を解決するにはどうすればよいですか?

24

これをたくさん掘り下げた後、私のために働いた唯一のものは

comment out the offending apps, run migrations, then add them in again.

単なる回避策ですが、うまくいけば誰かを助けるでしょう。

25
dlsso

私はこの問題に遭遇し、モデルをコメントアウトすることは実際には解決策ではないため、ドキュメント化されていないauto_created = TrueをMetaクラスに設定すると、Djangoそれを無視します。

class GroupProxy(Group):

    class Meta:
        proxy = True
        auto_created = True
18
augustomen

アプリのルートにmigrationsディレクトリを作成し(つまり、users/migrations/の場合)、空の__init__.pyファイルを追加するだけで問題が解決する場合があります。少なくとも、同じエラーが発生したときは、それは私にとってはうまくいきました。

ただし、上記の@zenofewordsで提案されているように、アプリでmakemigrationsを実行したほうがよいでしょう。これにより、ディレクトリが作成され、プロキシモデルの移行が生成されます。

Djangoプロキシモデルの移行ファイルを作成する理由

テストはそれらの移行を探しており、それらを見つけていません。

15
tino

実行してみましたかmanage.py makemigrations <app_label>テストを実行する前にアプリで実行しますか?

また、プロキシしようとしているモデルのアプリがINSTALLED_APPSに含まれているかどうかを確認します。

9
zenofewords

今日の午後の大半を自分でこのエラーを解決するために費やし、「アプリのコメントアウト」、「テーブルの削除」、データベース全体の削除の考えられるあらゆる組み合わせを経験した結果、私の問題は「移行」の単純な欠如が原因であることがわかりましたフォルダーとそのフォルダー内の__ init__.pyファイル。

以前の正解であった回答の1つは、言及された問題を修正したため、現在は正しくありません here

「init.py」に記載されているモデルが含まれているすべてのディレクトリを確認してください。

おそらくすべての人の問題を解決することはできませんが、それは私の助けになりました。

5
Tom Pegler

私もこの問題に直面しました(複雑なモデルの継承を行った後)。含まれている私の移行の1つ

_migrations.CreateModel(
    name='Offer',
    fields=[
        # ...
    ],
    options={
        # ...
    },
    bases=('shop.entity',),
),
_

_shop.Entity_モデルを完全に削除しましたが、移行はbases属性でそれを参照していました。だから私はbases=('shop.entity',)を削除しただけで動作します。それはおそらく最初から移行する機会を壊すでしょうが、少なくともさらに移行することができます。

もう1つのアドバイスは、Djangoコードに直接移動して、「ベース」の問題の原因を調べます。_Django/db/migrations/state.py_に移動して、ブレークポイントを追加します。

_try:
    bases = Tuple(
        (apps.get_model(base) if isinstance(base, six.string_types) else base)
        for base in self.bases
    )
except LookupError:
    print(self.bases)  # <-- print the bases
    import ipdb; ipdb.set_trace()  # <-- debug here
    raise InvalidBasesError("Cannot resolve one or more bases from %r" % (self.bases,))
_
3
MrKsn

プロキシモデルの束の親テーブルの名前を変更した後、この問題が発生しました。私はそれを解決しました:

  1. 親テーブルの名前が変更された移行ファイルを削除します。
  2. Postgresターミナルを使用して、親テーブルの名前を以前の名前に変更しました。
  3. makemigrationsmigrateを再度実行しました
1

1つの可能性は、移行ファイル内のモデルの削除または作成が間違った順序になっていることです。 Django 1.7.8で、ベースモデルが派生モデルの前にあったときにこれを経験しました。モデルを削除するための順序を交換すると、問題が修正されました。

0
dustinrwh

他のアプリを使用せずに私に起こりました-他のモデルのベースであるモデルの名前を変更した(そしておそらく同じ移行内にそのサブモデルを作成した)ため、スーパーモデルの名前を元の名前に変更して解決しました

0
user1611083

これが、migrationsフォルダー(およびinit。pyファイルが含まれている)が既にあるアプリで発生した場合は、他のすべてのファイルを削除し、makemigrationsおよびmigrate再び。

PS:データベースのmodels.pyまたはいくつかのテーブルを手動で再構成する必要があるかもしれません。

0
xPete

これがpython manage.py testの実行中にのみ発生している場合(おそらく必要な移行を既に行っているため)、設定モジュールのcontrib.authMIGRATION_MODULESを移行しないように明示する必要があります。

MIGRATION_MODULES(
        'auth': "contrib.auth.migrations_not_used_in_tests",
)
0
Iván Alegre

私は同じ問題に直面し、app_labelclass Meta:属性を追加してエラーを解決しました:

class GroupProxy(Group):
    class Meta:
        proxy = True
        app_label = '<app in which you want this model>'
        verbose_name = Group._meta.verbose_name
        verbose_name_plural = Group._meta.verbose_name_plural
0
Timothé Delion