我一直在South的网站,Google和SO上寻找答案,但是找不到简单的方法来做到这一点。
我想使用South重命名Django模型。说你有以下几点:
class Foo(models.Model): name = models.CharField() class FooTwo(models.Model): name = models.CharField() foo = models.ForeignKey(Foo)
并且你想要将Foo转换为Bar,即
Foo
Bar
class Bar(models.Model): name = models.CharField() class FooTwo(models.Model): name = models.CharField() foo = models.ForeignKey(Bar)
为简单起见,我只是尝试将名称从更改Foo为Bar,但现在忽略其中的foo成员FooTwo。
foo
FooTwo
使用South进行此操作最简单的方法是什么?
db.rename_table('city_citystate', 'geo_citystate')
为了回答你的第一个问题,简单的模型/表重命名非常简单。运行命令:
./manage.py schemamigration yourapp rename_foo_to_bar --empty
(更新2:尝试--auto,而不是--empty避免低于警告感谢@KFB的提示。)
--auto
--empty
如果你使用的是南方的旧版本,则需要startmigration而不是schemamigration。
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模型类中的Meta选项来更简单地完成此操作。但是每次这样做,都增加了代码库的旧版权重-类名与表名不同会使代码难以理解和维护。为了清楚起见,我完全支持执行这样的简单重构。
(更新)我刚刚在生产环境中尝试过此操作,并在应用迁移时收到一个奇怪的警告。它说:
The following content types are stale and need to be deleted: yourapp | foo Any objects related to these content types by a foreign key will also be deleted. Are you sure you want to delete these content types? If you're unsure, answer 'no'.
我回答“不”,一切似乎都很好。