我遇到了旧迁移包含对类甚至不再定义的模块的引用的问题。解决这些问题的最佳方法是什么?
我可以通过删除这些引用来消除错误消息,但如果我打破迁移会怎样?
我也是唯一一个认为Django 1.7迁移实际导入部分代码库的人,因为我很明显会编辑它吗?
示例错误消息:
Traceback (most recent call last):
...
File "/.../migrations/0001_initial.py", line 194, in Migration
bases=(model_utils.models.UserPersonMixin, models.Model),
AttributeError: 'module' object has no attribute 'UserPersonMixin'
在这种情况下,UserPersonMixin是一个抽象基类,这个模型用来继承,但我最近在重新组织时已经破坏了。
答案 0 :(得分:2)
在迁移过程中,您应该访问历史模型,而不是像往常那样导入实际模型。
这样做是为了解决你遇到的问题。要获取历史mdoels(即创建此类迁移时存在的模型),您必须替换代码:
从官方django文档(this case is for data migrations althought the concept applies to your case)中查看:
# -*- coding: utf-8 -*-
from django.db import models, migrations
def combine_names(apps, schema_editor):
# We can't import the Person model directly as it may be a newer
# version than this migration expects. We use the historical version.
Person = apps.get_model("yourappname", "Person")
for person in Person.objects.all():
person.name = "%s %s" % (person.first_name, person.last_name)
person.save()
class Migration(migrations.Migration):
dependencies = [
('yourappname', '0001_initial'),
]
operations = [
migrations.RunPython(combine_names),
]
此迁移执行python代码,并且需要某个模型。为了避免导入不再存在的模型,它不是直接导入,而是“精确时间片”中对模型的“聚合”访问。这段代码:
apps.get_model("yourappname", "Person")
将完全替代:
from yourappname.models import Person
因为后者在一个必须运行迁移的全新安装中会失败。
修改,请发布您的迁移的完整代码,看看我是否可以帮助您处理您的特定情况,因为我的项目的模型不再(即已删除)但没有这样的问题。