InvalidBasesError:无法解析[<ModelState:'users.GroupProxy'>]的基数

Dmi*_*lov 24 python django unit-testing django-models django-migrations

当我运行测试时,我在数据库初始化期间遇到此错误:

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)
Run Code Online (Sandbox Code Playgroud)

我为contrib.auth Group模型创建了这个代理,将它放在django admin的应用程序中:

class GroupProxy(Group):
    class Meta:
        proxy = True
        verbose_name = Group._meta.verbose_name
        verbose_name_plural = Group._meta.verbose_name_plural
Run Code Online (Sandbox Code Playgroud)

那么我该怎么做才能解决这个问题呢?

dls*_*sso 23

经过大量挖掘后,唯一对我有用的是

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

只是一个解决方法,但希望它有助于某人.

  • 只需添加一个名为"migrations"的文件夹,然后在其中创建"__init__.py"文件. (6认同)
  • 你的意思是从 INSTALLED_APPS 中注释掉它们吗? (3认同)

aug*_*men 18

我已经遇到过这个问题,并且由于评论模型并不是真正的解决方案,我发现将未记录的设置auto_created = True为Meta类将使Django忽略它.

class GroupProxy(Group):

    class Meta:
        proxy = True
        auto_created = True
Run Code Online (Sandbox Code Playgroud)


tin*_*ino 14

只需migrations在应用程序的根目录创建一个目录(users/migrations/在您的情况下),并添加一个空__init__.py文件可能会解决您的问题.当我遇到同样的错误时,至少它对我有用.

makemigrations正如上面的@zenofewords所建议的,你最好为你的应用程序运行.这将为您创建目录并为您的代理模型生成迁移.

为什么Django会为代理模型创建迁移文件?

您的测试正在寻找那些迁移并且没有找到它们.


zen*_*rds 9

manage.py makemigrations <app_label>在运行测试之前,您是否尝试在应用上运行?

此外,检查应用程序您尝试代理的型号是否包含在INSTALLED_APPS中.


Tom*_*ler 6

今天下午的大部分时间都在试图自己解决这个错误,经历了“注释掉应用程序”、“删除表”和删除整个数据库的所有可能的组合,我发现我的问题是由于缺乏“迁移”造成的文件夹和该文件夹内的 __ init__.py 文件。

正确的旧答案之一现在不再正确,因为他们已经解决了此处提到的问题。

检查包含“init.py”中提到的模型的每个目录,它应该消失。

可能不会解决每个人的情况,但它对我的有所帮助。


MrK*_*Ksn 5

我也遇到了这个问题(在做了一些复杂的模型继承之后)。我的一次迁移包含

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

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,))
Run Code Online (Sandbox Code Playgroud)


Sau*_*tel 5

添加名为“ migrations”的文件夹并在此文件夹中创建“ __init__.py”文件