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

问题描述 投票:0回答:1

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

发生什么变化打破了这个?

django django-migrations django-1.8
1个回答
0
投票

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

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

model.manytomanyfield.add(match_mech)

使用

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

这很笨拙,当您需要进行一些迁移时,如果要做的话有点麻烦,但是它又使一切重新运行了,此后我没有发现任何问题。

© www.soinside.com 2019 - 2024. All rights reserved.