1

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

我可以通过删除这些引用来消除错误消息,但是如果我破坏了迁移怎么办?

考虑到我显然要编辑它,我也是唯一一个认为 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 是一个抽象基类,这个模型曾经继承自它,但我最近在重组时丢弃了它。

4

1 回答 1

2

在您的迁移中,您应该访问历史模型,而不是像通常那样导入实际模型。

这样做是为了避免您遇到的问题。要获取历史 mdoels(即创建此类迁移时存在的模型),您必须替换您的代码:

从官方 django 文档中检查这一点(此案例用于数据迁移,尽管该概念适用于您的案例):

# -*- 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

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

编辑请发布您的迁移的完整代码,看看我是否可以帮助您处理您的特定情况,因为我有一个项目的模型不再存在(即已删除)但没有此类问题。

于 2014-09-24T16:42:25.117 回答