我一直在南方的谷歌等网站上寻找这个问题的答案,但找不到一个简单的方法来做到这一点.

我想用South重命名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)

为了简单起见,我只是try 将名称从Foo更改为Bar,但现在忽略FooTwo中的foo成员.

使用South最简单的方法是什么?

  1. 我也许可以进行数据迁移,但这似乎相当复杂.
  2. 编写自定义迁移,例如db.rename_table('city_citystate', 'geo_citystate'),但我不确定在这种情况下如何修复外键.
  3. 一种你知道的更简单的方法?

推荐答案

要回答您的第一个问题,简单的模型/表重命名非常简单.运行命令:

./manage.py schemamigration yourapp rename_foo_to_bar --empty

(更新2:try --auto而不是--empty,以避免下面的警告.感谢@kfb的提示.)

如果您使用的是较旧版本的South,则需要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_tableMeta选项更简单地实现这一点.但是每次这样做都会增加代码库的遗留权重--类名与表名不同会使代码更难理解和维护.为了清晰起见,我完全支持做这样的简单重构.

(更新版)我刚刚在生产中try 了一下,当我go 应用迁移时收到了一个奇怪的警告.它说:

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'.

我回答"不",一切似乎都很好.

Django相关问答推荐

Django、htmx删除记录并更新

DRF中没有参数的视图的警告-壮观

通过在其他查询中使用来过滤对象

try 获取静态文件路径时 Django 给出错误

如果字段为空,则 Unique_together 不起作用.怎么约束呢?

如何在不编写每个视图中的逻辑的情况下呈现值,Django?

在模板中调用 FileField 对象会呈现不正确的路径

Playframework 和 Django

Django 表单有 Select 但也有自由文本选项?

使用 Vagrant 进行端口转发时连接重置

Django中的左外反向select_related?

Django ModelForm 没有指定模型类

如何按名称设置 django 模型字段?

Django UrlResolver,在运行时添加 url 进行测试

Django:如何使用动态(非模型)数据预填充 FormView?

CSS 文件中的 Django 媒体 URL

这是验证 Django 模型字段的方法吗?

Django 覆盖模型 Clean() 与 Save()

RemovedInDjango18Warning:不推荐创建没有fields属性或 exclude属性的 ModelForm

Django的不区分大小写的网址?