我正在从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(),它将返回一个可用于更新该记录的对象,但不能用于设置对该对象的引用)
是什么改变了这一点?
答案 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)
这很笨拙,当您需要进行一些迁移时,如果要做的话有点麻烦,但是它又使一切重新运行了,此后我没有发现任何问题。