在Django 1.7和1.8之间迁移行为的更改

时间:2019-06-05 08:31:51

标签: django django-migrations django-1.8

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

是什么改变了这一点?

1 个答案:

答案 0 :(得分:0)

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

许多对许多引用比较棘手,并且通过替换来解决:

model.manytomanyfield.add(match_mech)

使用

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

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