使用south重命名django模型类名和相应的外键,而不会丢失数据

wha*_*atf 6 python django mysql-management django-south

以下是我的模型:

class myUser_Group(models.Model):
    name = models.CharField(max_length=100)


class Channel(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=1000)
    belongs_to_group = models.ManyToManyField(myUser_Group)

class Video(models.Model):
    video_url = models.URLField(max_length=300) 
    belongs_to_channel = models.ManyToManyField(Channel)
    description = models.CharField(max_length=1000)
    tags = TagField()

class UserProfile(models.Model):
       user = models.OneToOneField(User)

class User_History(models.Model):
    date_time = models.DateTimeField()
    user = models.ForeignKey(UserProfile, null=True, blank=True)
    videos_watched = models.ManyToManyField(Video)
Run Code Online (Sandbox Code Playgroud)

我只是想从所有类名中删除下划线,以便User_History外观UserHistory,也应该更新外键.我尝试使用南方但在文档中找不到它.

一种方法是导出数据,卸载南,删除迁移,重命名表,然后再次导入数据.还有其他办法吗?

mmc*_*kle 8

你可以使用South来做到这一点.

对于此示例,我有一个usergroups使用以下模型调用的应用程序:

class myUser_Group(models.Model):
    name = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

我假设已经在南方的移民控制下.

使模型名称更改:

class MyUserGroup(models.Model):
    name = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

并从南方创建一个空的迁移

$ python manage.py schemamigration usergroups model_name_change --empty
Run Code Online (Sandbox Code Playgroud)

这将创建一个框架迁移文件,供您指定发生的情况.如果我们编辑它,看起来像这样(此文件将位于app_name/migrations /文件夹中 - 在这种情况下为usergroups/migrations /):

import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models

class Migration(SchemaMigration):

    def forwards(self, orm):
        # Change the table name from the old model name to the new model name
        # ADD THIS LINE (using the correct table names)
        db.rename_table('usergroups_myuser_group', 'usergroups_myusergroup')


    def backwards(self, orm):
        # Provide a way to do the migration backwards by renaming the other way
        # ADD THIS LINE (using the correct table names)
        db.rename_table('usergroups_myusergroup', 'usergroups_myuser_group')


    models = {
        'usergroups.myusergroup': {
            'Meta': {'object_name': 'MyUserGroup'},
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
        }
    }

    complete_apps = ['usergroups']
Run Code Online (Sandbox Code Playgroud)

在该forwards方法中,我们重命名数据库表名称以匹配django ORM将使用新模型名称查找的内容.我们撤消更改backwards以确保在需要时可以退回迁移.

无需导入/导出现有数据即可运行迁移:

$ python manage.py migrate

剩下的唯一步骤是更新引用myUser_Group的模型中的外键和多对多列,并更改为引用MyUserGroup.