Django 1.7迁移中的未定义类

时间:2014-09-24 16:23:33

标签: django django-1.7 django-migrations

我遇到了旧迁移包含对类甚至不再定义的模块的引用的问题。解决这些问题的最佳方法是什么?

我可以通过删除这些引用来消除错误消息,但如果我打破迁移会怎样?

我也是唯一一个认为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是一个抽象基类,这个模型用来继承,但我最近在重新组织时已经破坏了。

1 个答案:

答案 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

因为后者在一个必须运行迁移的全新安装中会失败。

修改,请发布您的迁移的完整代码,看看我是否可以帮助您处理您的特定情况,因为我的项目的模型不再(即已删除)但没有这样的问题。