关于python:Django – 如何使用South重命名模型字段?

Django - How to rename a model field using South?

我想更改模型中特定字段的名称:

1
2
3
class Foo(models.Model):
    name = models.CharField()
    rel  = models.ForeignKey(Bar)

应改为:

1
2
3
class Foo(models.Model):
    full_name     = models.CharField()
    odd_relation  = models.ForeignKey(Bar)

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


您可以使用db.rename_column函数。

1
2
3
4
5
6
7
8
9
10
11
12
class Migration:

    def forwards(self, orm):
        # Rename 'name' field to 'full_name'
        db.rename_column('app_foo', 'name', 'full_name')




    def backwards(self, orm):
        # Rename 'full_name' field to 'name'
        db.rename_column('app_foo', 'full_name', 'name')

db.rename_column的第一个参数是表名,因此请记住django是如何创建表名的:

Django automatically derives the name of the database table from the name of your model class and the app that contains it. A model's database table name is constructed by joining the model's"app label" -- the name you used in manage.py startapp -- to the model's class name, with an underscore between them.

如果您有多个单词、驼色大小写的模型名称,例如projectitem,则表名将为app_projectitem(即,即使是驼色大小写的,也不会在projectitem之间插入下划线)。


我要做的是:

  • 在您的模型中更改列名(在本例中是myapp/models.py)
  • 运行./manage.py schemamigration myapp renaming_column_x --auto
  • 注:renaming_column_x可以是您喜欢的任何东西,它只是为迁移文件提供描述性名称的一种方法。

    这将生成一个名为myapp/migrations/000x_renaming_column_x.py的文件,该文件将删除旧列并添加新列。

    修改此文件中的代码以将迁移行为更改为简单的重命名:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Migration(SchemaMigration):

        def forwards(self, orm):
            # Renaming column 'mymodel.old_column_name' to 'mymodel.new_column_name'
            db.rename_column(u'myapp_mymodel', 'old_column_name', 'new_column_name')

        def backwards(self, orm):
            # Renaming column 'mymodel.new_column_name' to 'mymodel.old_column_name'
            db.rename_column(u'myapp_mymodel', 'new_column_name', 'old_column_name')


    我不知道db.rename列,这听起来很方便,但是在过去,我添加了新列作为一个架构迁移,然后创建了一个数据迁移以将值移动到新字段,然后再创建第二个架构迁移以删除旧列。


    Django1.7引入了迁移,所以现在您甚至不需要安装额外的包来管理迁移。

    要重命名模型,需要先创建空迁移:

    1
    $ manage.py makemigrations  --empty

    然后您需要像这样编辑迁移的代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    from django.db import models, migrations

    class Migration(migrations.Migration):

    dependencies = [
        ('yourapp', 'XXXX_your_previous_migration'),
    ]

    operations = [
        migrations.RenameField(
            model_name='Foo',
            old_name='name',
            new_name='full_name'
        ),
        migrations.RenameField(
            model_name='Foo',
            old_name='rel',
            new_name='odd_relation'
        ),
    ]

    然后你需要跑:

    1
    $ manage.py migrate

    只需更改模型并在1.9中运行makemigrations

    Django自动检测到您已删除并创建了单个字段,并询问:

    1
    Did you rename model.old to model.new (a IntegerField)? [y/N]

    如果选择"是",则会创建正确的迁移。魔术。


  • south添加到项目设置文件中已安装的应用程序中。
  • 注释添加/修改的字段/表。
  • 埃多克斯1〔10〕
  • 江户十一〔11〕。
  • 取消对字段的注释并写入修改后的字段
  • 埃多克斯1〔12〕
  • 埃多克斯1〔13〕
  • 如果您使用的是"pycharm",那么您可以使用"ctrl+shift+r"而不是"manage.py",以及"shift"作为参数。