我正在从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(),它将返回一个可用于更新该记录的对象,但不能用于设置对该对象的引用)
发生什么变化打破了这个?
所以,我从来没有弄清楚这里到底发生了什么变化,但是最后每种情况都可以通过手动使用有问题的ID字段来解决,因此对于外键引用,field = model
变为field_id = model.pk
[多对多引用有点棘手,并且通过替换来解决:
model.manytomanyfield.add(match_mech)
使用
model.manytomanyfield.create(model_id=model.pk, othermodel_id=othermodel.pk)
这很笨拙,当您需要进行一些迁移时,如果要做的话有点麻烦,但是它又使一切重新运行了,此后我没有发现任何问题。