django-south - 降级依赖关系的正确方法?

时间:2011-10-24 15:28:48

标签: django django-models django-south

我正在使用django构建应用程序,并使用django-south进行数据库模式迁移。我正在使用django-mptt构建一个评论系统,我安装了0.5-pre(当前的git master分支)。

我正在使用的版本有一个名为TreeForeignKey的django字段,但我正在尝试测试0.5是否存在0.4中存在的错误,所以我删除了我的django-mptt版本安装了cheeseshop的当前版本。我修改了代码以使用ForeignKey而不是TreeForeignKey

当需要进行迁移时,它显然会打破这条消息:

ValueError: Cannot import the required field 'mptt.fields.TreeForeignKey'

我的所有迁移文件都引用了mptt.fields.TreeForeignKey,这在django-mptt 0.4中不存在。

我的Comment模型在django-mptt 0.5中:

from mptt.models import MPTTModel
from mptt.fields import TreeForeignKey

class Comment(MPTTModel):
    # ...
    parent = TreeForeignKey('self', related_name='children', blank=True, null=True)

我降级到django-mptt 0.4后的同一模型

import django.db.models
from mptt.models import MPTTModel

class Comment(MPTTModel):
    # ... cruft
    # TreeForeignKey does not exist in mptt 0.5!
    parent = models.ForeignKey('self', related_name='children', blank=True, null=True) 

我想出了两种相当黑客的方法来解决这个问题并允许迁移工作:

  1. TreeForeignKey课程添加到我的django-mptt install。
  2. 修改我的迁移文件以删除对mptt.fields.TreeForeignKey
  3. 的引用

    我采用了第一种方法并且它有效,但我觉得这有点像黑客(但没有第二种选择那么多)。

    是否有一种非hacky方式来做降级依赖项所做的事情,导致我的模型中的某些字段发生变化?

1 个答案:

答案 0 :(得分:2)

这与南方无关。在0.5.pre之前,django-mptt的fields模块不存在。所以当你降级到0.4时,你现在正确地得到了一个ImportError。

我无法告诉你使用的正确导入是什么,因为我没有运行0.4并且出于某种疯狂的原因,开发人员没有维护0.4文档。但是,您的第二种方法似乎最合适。在迁移中不应该有任何理由需要实际使用TreeForeignKey。它只是标准ForeignKey的包装。