Django 1.7 和 1.8 之间迁移行为的变化

Posted

技术标签:

【中文标题】Django 1.7 和 1.8 之间迁移行为的变化【英文标题】:Change in migration behaviour between Django 1.7 & 1.8 【发布时间】:2019-10-20 17:57:51 【问题描述】:

我正在从 Django 1.7 迁移旧的 Django 应用程序。我目前的方法基本上是升级一个版本然后运行 ​​manage.py test 看看我需要修复什么。

Django 1.8 中似乎发生了一些改变,破坏了一些现有的迁移。以下在 Django 1.7 中工作,但在 1.8 下中断

def load_pilotranks(apps, schema_editor):
    PilotRank = apps.get_model('warbook', 'PilotRank')
    ranks = [
       'rank' : 'Champion', 'min_piloting' : 0, 'min_gunnery' : 0, 'skills_limit' : 0 
    ,  'rank' : 'Star', 'promotion': 'Champion', 'min_piloting' : 0, 'min_gunnery' : 0, 'skills_limit' : 0 
    ,  'rank' : 'Contender', 'min_gunnery' : 3, 'min_piloting': 4, 'skills_limit': 2, 'auto_train_cp': 1, 'promotion': 'Star' 
    ,  'rank' : 'Rookie', 'min_gunnery' : 4, 'min_piloting': 5, 'skills_limit': 1, 'auto_train_cp': 2, 'promotion': 'Contender' 
    ]

    for rank in ranks:
        if 'promotion' in rank:
            rank['promotion'] = PilotRank.objects.get(rank=rank['promotion'])
        PilotRank.objects.create(**rank)

现在这会产生错误: ValueError:无法分配“”:“PilotRank.promotion”必须是“PilotRank”实例。

(虽然这个示例可能可以通过用 JSON 固定装置替换有问题的代码来解决,但还有更复杂的示例更难解决)。

共同点似乎是apps.get_model返回的Model对象并不总是有效(如果我使用model.object.get()它将返回一个可用于更新该记录的对象,但不能用于设置对该对象的引用)

是什么改变了这个?

【问题讨论】:

至少这可以用rank['promotion_id'] = PilotRank.objects.get(rank=rank['promotion']).pk(和del rank['promotion'])之类的东西轻松解决,但发现很奇怪。 是否有适合多对多字段的等效项(即将 ID 传递给 model.relation.add() ?) 我不知道它是否适用于您在迁移中获得的假模型,但正常的多对多字段具有导致不可见背景模型的“通过”属性;所以 model.relation.through.objects.create(object1_id=..., object2_id=...) 可以工作。 【参考方案1】:

所以,我从来没有准确地弄清楚这里发生了什么变化,但最终每种情况都可以通过手动使用相关的 ID 字段来解决,因此对于外键引用 field = model 变为 field_id = model.pk

多对多引用有点棘手,通过替换解决:

model.manytomanyfield.add(match_mech)

model.manytomanyfield.create(model_id=model.pk, othermodel_id=othermodel.pk)

它很笨重,而且当您需要完成一些迁移时,如果做起来有点痛苦,但它可以让一切重新运行,从那以后我没有发现任何问题。

【讨论】:

以上是关于Django 1.7 和 1.8 之间迁移行为的变化的主要内容,如果未能解决你的问题,请参考以下文章

为啥 django 1.7 会为字段选择的变化创建迁移?

django 1.8 测试模型和迁移

django 1.7 迁移——如何清除所有迁移并从头开始?

在迁移中获取模型 ContentType - Django 1.7

Django 1.7 内置迁移与南迁移?

Django 1.8 迁移、自定义用户模型和 Postgres/MySQL 的奇怪问题