几个月前,我将应用程序从Django 1.6升级到了1.7,然后又从1.8升级了,现在我正致力于将1.9升级。
在解决迁移问题时,我发现了一个非常讨厌的数据库状态依赖实例-一种自定义用户模型调用(不是那么好)的管理方法django.contrib.auth.models.Group
。kes。因此,当我建立持续集成管道时,我设法通过数据迁移解决了问题,并且一切都很好。
迁移如下所示:
# 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对要求它插入已经拥有的行感到不安。不过这可以正常工作,我们一直很高兴露营者愉快地进行测试,而且我们的环境都没有任何问题。
因此,我一直在运行测试并修复过时的问题,更新库,等等等等。因此,令人惊讶的是,仅在Django版本从1.8更改为1.9时,我的CI环境(一种中等受欢迎的服务)未能在迁移步骤中构建。
我检查了是否存在某种形式的缓存依赖关系链问题(我们正在加载所有正确的库),但是错误的回溯是非常熟悉的...。
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做事情的绝妙方法。
因此,我们在这里有一个模型经理:
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')
允许迁移无问题地运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句