it-roy-ru.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)

Я создал этот прокси для групповой модели contrib.auth, чтобы разместить его в своем приложении в админке Django:

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

Итак, что я могу сделать, чтобы решить эту проблему?

20
Dmitrii Mikhailov

После долгих раскопок это единственное, что сработало для меня, было

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

Просто обходной путь, но, надеюсь, это кому-нибудь поможет.

20
dlsso

Я сталкивался с этой проблемой, и, комментируя модель, на самом деле не является решением, я обнаружил, что установка недокументированного auto_created = True для класса Meta заставит Django его игнорировать.

class GroupProxy(Group):

    class Meta:
        proxy = True
        auto_created = True
13
Augusto Men

Простое создание каталога migrations в корне вашего приложения (в нашем случае users/migrations/) и добавление пустого файла __init__.py может решить вашу проблему. По крайней мере, это было для меня, когда я получал ту же ошибку.

Но вам лучше запустить makemigrations для своего приложения, как предложено выше @ Zenofewords. Это создаст каталог для вас и сгенерирует миграции для ваших прокси-моделей.

Почему Django создает файлы миграции для моделей прокси?

Ваши тесты ищут эти миграции и не находят их.

11
tino

Вы пытались запустить manage.py makemigrations <app_label> в своем приложении перед запуском тестов?

Кроме того, проверьте, включено ли приложение, модель (и) которого вы пытаетесь использовать в качестве Прокси, в свой INSTALLED_APPS.

7
zenofewords

Потратив большую часть этого дня, пытаясь решить эту ошибку самостоятельно, пройдя все мыслимые комбинации «комментирования приложений», «удаления таблиц» и удаления целых баз данных, я обнаружил, что моя проблема была вызвана простым отсутствием «миграций». папка и файл __ init__.py внутри указанной папки.

Один из старых ответов, который был правильным, теперь больше не является корректным, поскольку они устранили проблему, о которой говорилось здесь .

Проверьте каждый каталог, который содержит модель, упомянутую в 'init.py', и она должна исчезнуть.

Вероятно, не решит дело каждого, но это помогло моему.

4
Tom Pegler

Я также столкнулся с этой проблемой (после некоторого сложного наследования модели). Одна из моих миграций содержала 

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

Я полностью удалил модель shop.Entity, но миграция ссылалась на нее в атрибуте bases. Поэтому я просто удалил bases=('shop.entity',), и это работает. Вероятно, это лишит возможности мигрировать с самого начала, но, по крайней мере, позволит мигрировать дальше.

Другой совет: перейдите непосредственно к коду 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

Возможно, что удаление или создание модели в файле миграции происходит в неправильном порядке. Я испытал это в Django 1.7.8, когда базовой моделью была ДО производной модели. Замена порядка удаления модели устранила проблему.

0
dustinrwh

У меня была эта проблема после того, как я переименовал родительскую таблицу группы моих прокси-моделей. Я решил это:

  1. Удалите файл миграции, для которого было изменено имя родительской таблицы.
  2. Используя терминал postgres, я переименовал родительскую таблицу в ее прежнее имя.
  3. Запущены makemigrations и migrate снова
0
Christopher Compeau

Если это происходит только при запуске python manage.py test (возможно, из-за того, что вы уже выполнили необходимые миграции), вам следует прямо сказать, что contrib.auth не должен мигрировать в MIGRATION_MODULES вашего модуля настроек.

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