如何使用迁移替换外键

时间:2014-11-09 22:45:45

标签: django django-models django-migrations

我希望将指向我的用户模型的现有ForeignKey替换为指向配置文件模型的用户模型。

模型的变化是:

created_by=models.ForeignKey(settings.AUTH_USER_MODULE)

要:

created_by=models.ForeignKey(settings.PROFILE_MODEL)

自动生成的迁移看起来像(带有常量的子):

migrations.AlterField(
        model_name=MODEL,
        name='created_by',
        field=models.ForeignKey(to=settings.PROFILE_MODEL),
        preserve_default=True,
    ),

我也有ManyToManyFields来处理。我的想法是,我希望在每个MODEL对象上运行一个函数,将用户对象解析为配置文件对象。我该怎么做呢?

用户和个人资料之间的关系是(反之亦然):

User.profile = Profile

编辑:忘记提及,如果运行自动生成的迁移,则会出现以下错误:

ValueError: Lookup failed for model referenced by field 
APP1.MODEL.created_by: APP2.PROFILE_MODEL

1 个答案:

答案 0 :(得分:0)

据我所知,您现在只想迁移我们的应用,而不希望任何内容可以更改为全局auth用户模型。那很容易。迁移适用于符号设置名称。

我用Django 1.7尝试过。可以来回切换settings.AUTH_USER_MODEL和settings.PROFILE_MODEL 没有任何问题。每次更改后都可以创建并应用迁移。测试模型还具有ManyToManyField以及User和Profile之间的相互关系。

我看到你有APP1和APP2。也许您为两者进行迁移并且它们是循环相关的,因此在完全应用当前的一次迁移之前应该应用其他应用程序迁移的一部分,反之亦然。可以通过将更改拆分为更小的更改并在每次更改后进行自动迁移来简化它,以便它们更少依赖。 OneToOneField优于两个相互外键,其反向关系甚至非常有用。在最坏的情况下,外键可以暂时更改为IntegerField(null=True),以简化数据迁移。这或多或少真的可行。

这个问题最初看起来不错,但问题应该更好地指定为可重现。

在阅读评论中的信息后删除原始文字进行编辑: