Python InvalidBasesError:无法解析[<;ModelState:';用户的基。GroupProxy';>;]

Python InvalidBasesError:无法解析[<;ModelState:';用户的基。GroupProxy';>;],python,django,unit-testing,django-models,django-migrations,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) 那么我可以做些什么来解决这个问题呢?在运行

运行测试时,在数据库初始化期间出现以下错误:

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)

那么我可以做些什么来解决这个问题呢?

在运行测试之前,您是否尝试过在应用程序上运行
manage.py makemigrations


此外,请检查您尝试代理的应用程序是否包含在已安装的应用程序中。

经过大量挖掘,对我来说唯一有效的方法是

注释掉有问题的应用程序,运行迁移,然后再次添加它们。


这只是一个解决方法,但希望它能帮助到某些人。

如果这只是在运行
python manage.py test
时发生的(可能是因为您已经进行了必要的迁移),您应该明确地说
contrib.auth
不应该在设置模块的
迁移模块中迁移

MIGRATION_MODULES(
        'auth': "contrib.auth.migrations_not_used_in_tests",
)

我遇到了这个问题,由于注释出模型并不是真正的解决方案,我发现将未记录的
auto_created=True
设置为Meta类会使Django忽略它

class GroupProxy(Group):

    class Meta:
        proxy = True
        auto_created = True

在重命名了一堆代理模型的父表之后,我遇到了这个问题。我通过以下方式解决了这一问题:

  • 正在删除父表的名称已更改的迁移文件
  • 使用postgres终端,我将父表重命名为以前的名称
  • 再次运行
    makemigrations
    migrate

  • 只需在应用程序的根目录下创建一个
    migrations
    目录(在您的情况下是
    users/migrations/
    ),然后添加一个空的
    \uu init\uuuuuuuuuuuuuuuuuuuuuuuupy
    文件,就可以解决您的问题。至少当我遇到同样的错误时,它对我是这样的

    但您最好按照以下建议为您的应用程序运行
    makemigrations
    @请看上面的话。这将为您创建目录,并为您的代理模型生成迁移

    您的测试正在寻找这些迁移,但没有找到它们。

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

    migrations.CreateModel(
        name='Offer',
        fields=[
            # ...
        ],
        options={
            # ...
        },
        bases=('shop.entity',),
    ),
    
    我完全删除了
    shop.Entity
    模型,但迁移是在
    base
    属性中引用它。所以我刚刚删除了
    base=('shop.entity',)
    ,它就可以工作了。它可能会从一开始就打破迁移的机会,但至少允许进一步迁移

    另一个建议是:直接转到django代码,检查是什么导致了“base”问题。转到
    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,))
    
    试试看:
    基=元组(
    (apps.get_model(base)如果是instance(base,六种.string_类型)否则为base)
    以自我为基础
    )
    除LookupError外:
    
    print(self.bases)#今天下午的大部分时间我自己都在试图解决这个错误,仔细检查了“注释掉应用程序”、“删除表”和删除整个数据库的各种可能的组合,我发现我的问题是由于文件夹中缺少一个“migrations”文件夹和一个_uuuuu_uuu.py文件造成的

    一个以前正确的答案现在不再正确,因为他们已经解决了上述问题。

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


    可能无法解决每个人的问题,但它帮助了我。

    一种可能是迁移文件中模型的删除或创建顺序错误。我在Django 1.7.8中经历过这种情况,当时基础模型在派生模型之前。交换删除模型的顺序修复了这个问题。

    发生在我身上,没有其他应用程序-只是因为我重命名了一个作为其他模型基础的模型(可能在同一次迁移中创建了该子模型)将超级模型重命名为其原始名称为我解决了这个问题

    我遇到了同样的问题,并在
    类Meta:
    中添加了
    app\u label
    属性解决了错误:

    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
    
    类组代理(组):
    类元:
    proxy=True
    应用程序标签=“”
    verbose\u name=Group.\u meta.verbose\u name
    verbose\u name\u复数=Group.\u meta.verbose\u name\u复数
    
    如果在已经有迁移文件夹(以及其中的init.py文件)的应用程序中发生这种情况,请删除所有其他文件,然后再次运行
    makemigrations
    migrate


    注意:您可能需要手动重新配置models.py或数据库中的某些表。

    如果有人犯了与我相同的错误,我也会遇到同样的问题,因为我没有对代理模型进行任何迁移。对我来说,这似乎没有必要,因为他们没有自己的DB表,我在文档中也没有看到任何提及这一点的内容
    python manage.py makemigrations
    立即修复了它。

    添加一个名为“
    migrations
    ”的文件夹,并在该文件夹中创建“
    \uuuu init\uuuuuuuuuuuuy.py
    ”文件

    有一个相关问题。看到我的答案了吗

    TL;博士

    创建您自己的操作以移除基座

    class RemoveModelBasesOptions(ModelOptionOperation):
    定义初始化(self,name):
    super()。\uuuu init\uuuu(名称)
    def解构(自我):
    kwargs={
    “name”:self.name,
    }
    返回(
    自我、阶级、资格名称、,
    [],
    关键字参数
    )
    def状态转发(自身、应用标签、状态):
    model\u state=state.models[应用程序标签,self.name\u下方]
    model_state.base=(models.model,)
    state.reload\u model(应用程序标签,self.name\u较低,延迟=真)
    def数据库转发(自、应用标签、模式编辑器、自状态、,
    致(州):
    通过
    def数据库向后(自、应用程序标签、模式编辑器、自状态、,
    致(州):
    通过
    def描述(自我):
    返回“从模型%s中删除基础”%self.name
    @财产
    def
    
    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