【问题标题】:Django Migrations fail during django initializationDjango 迁移在 Django 初始化期间失败
【发布时间】:2016-05-04 15:05:36
【问题描述】:

设置

几个月前,我将一个应用程序从 Django 1.6 升级到 1.7,然后是 1.8,现在我正在努力升级到 1.9。

在与迁移争吵时,我发现了一个非常讨厌的数据库状态依赖实例 - (不太好)自定义用户模型调用 django.contrib.auth.models.Group 上的一种管理方法。哎呀。因此,当我设置持续集成管道时,我设法通过数据迁移解决了问题,一切都很好。

迁移如下所示:

# import statements left out for brevity

def seed_groups(apps, schema_editor):
    Group = apps.get_model('auth', 'Group')
    Group.objects.get_or_create(name='group1')
    Group.objects.get_or_create(name='group2')
    Group.objects.get_or_create(name='group3')

class Migration(migrations.Migration):
    dependencies = [('auth', '0001_initial')]
    operations = [migrations.RunPython(seed_groups)]

好吧,这不是很好——这里使用get_or_create 允许我们连接一个已经有数据的数据库,而不会让 Postgres 对要求它插入它已经有的行感到非常不安。不过这很有效,我们很高兴露营者能够愉快地进行测试,而且我们的环境都没有出现任何问题。

转折

所以我一直在运行我的测试并修复弃用,更新库,等等等等。因此,令人惊讶的是,我的 CI 环境(一个中等受欢迎的服务)在迁移步骤中未能构建,只是因为 Django 版本从 1.8 更改为 1.9。

我检查过不存在某种缓存依赖链问题(我们正在加载所有正确的库),但错误的回溯非常熟悉......

django.db.utils.ProgrammingError: relation "auth_group" does not exist
LINE 1: ...ELECT "auth_group"."id", "auth_group"."name" FROM "auth_grou...
^

此处提供完整的回溯:https://gist.github.com/alexkahn/b63c41904809cbe53962dc104e4067f0

运行python manage.py migrate --no-input时出现此错误

我为解决问题所做的徒劳尝试:

像这样修改seed_groups函数:

def seed_groups(apps, schema_editor):
    # same
    db_alias = schema_editor.connection.alias
    Group.objects.using(db_alias).get_or_create(name='group1')
    # etc...

initial = True 类属性添加到此应用的0001 迁移中。

将所有迁移压缩为一个。

将我已安装的应用列表直接指向此应用的 AppConfig 子类。

我不知道我在想什么。

底线

有人知道为什么这会突然改变吗?有什么非常明显的事情让我想太多了吗?

【问题讨论】:

  • 最好将您的最新更新添加为答案,而不是编辑问题。这样一来,您为解决问题所做的工作就更清楚了。

标签: django


【解决方案1】:

所以这导致了一些新的破坏......不是用 Django 做事的好方法。

所以我们这里有一个模型管理器:

class UserManager(BaseUserManager):
    def users_in_group1(self):
        return Group.objects.get(name='group1').user_set.filter()

它返回一个直接与 auth.models.Group 模型交互的查询集。此处模型之间的紧密耦合导致 Django 需要在创建任何表之前解决该关系。

一个简单的改变:

def users_in_group1(self):
    return self.filter(groups__name='group1')

允许迁移顺利运行。

【讨论】:

    【解决方案2】:

    Django 系统检查在迁移之前运行。在 1.9 中添加的 URL system checks 检查您的 URL 配置,这会导致您的视图被导入。

    这部分回溯显示SuperUserAccountForm 在模块加载时引起查询。这会在您迁移时导致错误,因为该表尚未创建。

    File "/home/rof/src/github.com/myapp/myapp/myapp/accounts/views.py", line 28, in <module>
    from myapp.accounts.forms import (
    File "/home/rof/src/github.com/myapp/myapp/myapp/accounts/forms.py", line 351, in <module>
    class SuperUserAccountForm(forms.ModelForm):
    File "/home/rof/src/github.com/myapp/myapp/myapp/accounts/forms.py", line 358, in SuperUserAccountForm
    queryset=Account.objects.group1(),
    File "/home/rof/src/github.com/myapp/myapp/myapp/accounts/models.py", line 71, in group1
    return Group.objects.get(name='group1').user_set.filter()
    

    【讨论】:

    • 感谢您抽出宝贵时间回答!很快就会跟进。
    猜你喜欢
    • 1970-01-01
    • 2020-05-29
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多