Django 1.7 和 1.8 之间迁移行为的变化
Change in migration behaviour between 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 fixture 替换有问题的代码来修复此示例,但还有更复杂的示例更难解决)。
共同点似乎是由 apps.get_model 编辑的模型对象 return 并不总是有效(如果我使用 model.object.get() 它会 return可用于更新该记录但不能用于设置对该对象的引用的对象)
有什么改变打破了这个?
所以,我从来没有弄清楚这里到底发生了什么变化,但最终每种情况都可以通过手动使用有问题的 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 迁移旧的 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 fixture 替换有问题的代码来修复此示例,但还有更复杂的示例更难解决)。
共同点似乎是由 apps.get_model 编辑的模型对象 return 并不总是有效(如果我使用 model.object.get() 它会 return可用于更新该记录但不能用于设置对该对象的引用的对象)
有什么改变打破了这个?
所以,我从来没有弄清楚这里到底发生了什么变化,但最终每种情况都可以通过手动使用有问题的 ID 字段来解决,因此对于外键引用 field = model
变为 field_id = model.pk
多对多引用有点棘手,已通过替换解决:
model.manytomanyfield.add(match_mech)
有
model.manytomanyfield.create(model_id=model.pk, othermodel_id=othermodel.pk)
它很笨重,当您需要完成一些迁移时,做起来有点痛苦,但它又得到了所有东西 运行,从那以后我发现没有任何问题。