InvalidBasesError: Невозможно разрешить базы для [ModelState: 'users.GroupProxy']

20

Когда я запускаю тесты, я получаю эту ошибку во время инициализации базы данных:

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

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

    
задан Dmitrii Mikhailov 15.05.2015 в 21:21
источник
  • @ Димитрий Михайлов, вы решили эту проблему? Я также сталкиваюсь с той же ошибкой для прокси-сервера, который я установил. Я был бы рад, если вы сможете мне помочь. –  SpiXel 09.09.2015 в 13:27
  • Мне пришлось запускать миграции для contrib.auth раньше, это не сработало иначе. –  Dmitrii Mikhailov 09.09.2015 в 14:45
  • Возможно, вам понадобится создать папку миграции с пустым init.py, чтобы Django мог фактически создать файл миграции. См. Ответ Tamriel stackoverflow.com/questions/27261030/... –  Jesuisme 08.11.2016 в 22:48

9 ответов

20

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

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

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

    
ответ дан dlsso 30.07.2015 в 22:22
  • просто добавьте папку с именем «migrations» и в ней создайте файл «init.py». –  elad silver 18.04.2018 в 17:55
  • действительно ли означают комментирование их из INSTALLED_APPS? –  sureshvv 15.05.2018 в 14:43
13

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

class GroupProxy(Group):

    class Meta:
        proxy = True
        auto_created = True
    
ответ дан Augusto Men 20.05.2016 в 15:39
  • Это вызовет проблемы при создании разрешений для этих приложений, однако, используйте его с осторожностью –  XelharK 10.04.2017 в 13:28
  • Не работает вообще. –  Dmitrii Mikhailov 15.11.2017 в 10:43
9

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

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

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

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

    
ответ дан tino 11.01.2017 в 18:21
7

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

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

    
ответ дан zenofewords 26.05.2015 в 11:44
  • при запуске теста python manage.py он попытается создать тестовую базу данных и применить все миграции до запуска тестов. –  Dmitrii Mikhailov 10.06.2015 в 16:44
  • У меня уже была база данных, но у меня отсутствовали файлы миграции. После того, как я это сделал (makemigrations <app>), у меня появились ошибки, которые уже существуют в таблице app_name.model_name. Я решил это, отредактировав файл миграции (app / migrations / 0001_initial.py) и закомментировав каждую строку в операциях = [. ..] список. –  Keith 27.02.2017 в 08:01
4

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

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

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

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

    
ответ дан Tom Pegler 21.11.2017 в 18:26
  • запускать makemigrations для всех приложений, которые вы используете. –  sureshvv 28.03.2018 в 22:21
3

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

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,))
    
ответ дан MrKsn 29.10.2017 в 09:30
0

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

    
ответ дан dustinrwh 07.09.2018 в 18:00
0

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

MIGRATION_MODULES(
        'auth': "contrib.auth.migrations_not_used_in_tests",
)
    
ответ дан Iván Alegre 02.03.2016 в 17:43
0

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

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