使用Django / South重命名模型的最简单的方法?

问题:

我在South的网站,Google和SO上一直在寻找答案,但找不到一个简单的方法来做到这一点。
我想使用南方重命名Django模型。
说你有以下几点:

class Foo(models.Model):
    name = models.CharField()

class FooTwo(models.Model):
    name = models.CharField()
    foo = models.ForeignKey(Foo)

你想将Foo转换成Bar,即

class Bar(models.Model):
    name = models.CharField()

class FooTwo(models.Model):
    name = models.CharField()
    foo = models.ForeignKey(Bar)

为了保持简单,我只想将名称从Foo更改为Bar,但现在忽略FooTwo中的foo成员。
使用南方最简单的方法是什么?

  1. 我可能会做一个数据迁移,但这似乎很参与。
  2. 编写自定义迁移,例如db.rename_table('city_citystate', 'geo_citystate'),但我不知道在这种情况下如何修复外键。
  3. 一个更简单的方法你知道吗

回答:

为了回答你的第一个问题,简单的模型/表重命名是非常简单的。运行命令:

./manage.py schemamigration yourapp rename_foo_to_bar --empty

(更新2:尝试--auto而不是--empty,以避免下面的警告。感谢@KFB的提示。)
如果您使用的是旧版本,则需要startmigration而不是schemamigration
然后手动编辑迁移文件,如下所示:

class Migration(SchemaMigration):

    def forwards(self, orm):
        db.rename_table('yourapp_foo', 'yourapp_bar')


    def backwards(self, orm):
        db.rename_table('yourapp_bar','yourapp_foo')   

您可以更简单地使用模型类中的db_table元选项来完成此操作。但是,每当你这样做时,你可以增加代码库的遗留重量 – 类名与表名不同会使你的代码更难理解和维护。为了清楚起见,我完全支持像这样简单的重构。
(更新)我刚刚在生产中尝试过,当我去应用迁移时,我得到了一个奇怪的警告。它说:

我回答“不”,一切似乎都很好。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Easiest way to rename a model using Django/South?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 3 = 2