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



我正在从Django 1.7迁移一个旧的Django应用程序。我目前的方法基本上是升级到一个版本,然后运行 manage.py 测试以查看我需要修复的内容。

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((,它将返回一个可用于更新该记录的对象,但不能用于设置对该对象的引用(

是什么变化打破了这一切?

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

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

model.manytomanyfield.add(match_mech)

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

它很笨重,当你有一些迁移要完成时,有点痛苦,但它让一切再次运行,从那以后我没有注意到任何问题。

最新更新