我有一个django应用程序,里面有四个模型.我现在意识到其中一个模型应该在一个单独的应用程序中.我确实为迁移安装了south,但我认为这不是它可以自动处理的.如何将其中一个模型从旧应用迁移到新应用?

另外,请记住,我需要这是一个可重复的过程,这样我才能迁移生产系统等.

推荐答案

如何向南migrations.

假设我们有两个应用程序:通用应用程序和特定应用程序:

myproject/
|-- common
|   |-- migrations
|   |   |-- 0001_initial.py
|   |   `-- 0002_create_cat.py
|   `-- models.py
`-- specific
    |-- migrations
    |   |-- 0001_initial.py
    |   `-- 0002_create_dog.py
    `-- models.py

现在,我们想将模型移动到通用模式.模型.cat到特定应用程序(精确到specific.models.cat).

$ python manage.py schemamigration specific create_cat --auto
 + Added model 'specific.cat'
$ python manage.py schemamigration common drop_cat --auto
 - Deleted model 'common.cat'

myproject/
|-- common
|   |-- migrations
|   |   |-- 0001_initial.py
|   |   |-- 0002_create_cat.py
|   |   `-- 0003_drop_cat.py
|   `-- models.py
`-- specific
    |-- migrations
    |   |-- 0001_initial.py
    |   |-- 0002_create_dog.py
    |   `-- 0003_create_cat.py
    `-- models.py

现在我们需要编辑两个迁移文件:

#0003_create_cat: replace existing forward and backward code
#to use just one sentence:

def forwards(self, orm):
    db.rename_table('common_cat', 'specific_cat') 

    if not db.dry_run:
        # For permissions to work properly after migrating
        orm['contenttypes.contenttype'].objects.filter(
            app_label='common',
            model='cat',
        ).update(app_label='specific')

def backwards(self, orm):
    db.rename_table('specific_cat', 'common_cat')

    if not db.dry_run:
        # For permissions to work properly after migrating
        orm['contenttypes.contenttype'].objects.filter(
            app_label='specific',
            model='cat',
        ).update(app_label='common')

#0003_drop_cat:replace existing forward and backward code
#to use just one sentence; add dependency:

depends_on = (
    ('specific', '0003_create_cat'),
)
def forwards(self, orm):
    pass
def backwards(self, orm):
    pass

现在,这两款应用的迁移都意识到了变化,生活变得更糟了:-)

python manage.py migrate common
 > specific: 0003_create_cat
 > common: 0003_drop_cat

将完成迁移和

python manage.py migrate specific 0002_create_dog
 < common: 0003_drop_cat
 < specific: 0003_create_cat

会把东西往下搬.

Notice that for upgrading of schema I used common app and for downgrading, I used specific app. That's because how the dependency here works.

Django相关问答推荐

如何使用Django';S生成的字段来统计相关对象?

在 Trunc 的 kind 属性中使用字段

Django: 无法将我的 comments 关联到特定产品

访问默认的 django-allauth 登录和注册页面时出现 TemplateSyntaxError

Django rest framework, AttributeError: 'str' object has no attribute 'data' 无法使用表单上传图片

Django:获取每组最新的N条记录

Django 表单字段必填和可选配置

在 Django 中处理信用卡付款的最佳 Select 是什么?

django - 表单没有错误,但 form.is_valid() 没有验证

Django:通过manage.py使用服务器和gunicorn等其他服务器之间的区别.哪个更好?

is_valid() vs clean() Django 表单

对 django 的 Http Delete 请求返回 301

如何使用 django-nose 运行单个测试或单个 TestCase?

Django unique=True 不工作

django admin 排序外键字段列表

在 PyPy 下运行 Django 的缺点?

python/django中setattr和对象操作的区别

Django将整数模型字段的范围设置为约束

ImportError:没有名为 django_filters 的模块

Django 字符串到日期格式