【问题标题】:South migration default value from other column?其他列的南迁移默认值?
【发布时间】:2025-12-25 16:25:10
【问题描述】:

我有一个模型,现在有一个列 description,它填充了网站几个不同页面上的一个区域。客户希望将其拆分为几个不同的列,以便他们可以在站点的某些部分填充不同的值。所以我必须将description 列更改为frontpage_descriptionresourcepage_description。我试图想出一种在 South 执行此操作的方法,以便 description 列的值是两个“新”列的(初始)默认值。这是我目前所拥有的:

# file: project/app/xxxx_mymigration.py
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models

class Migration(SchemaMigration):
    def forwards(self, orm):
        db.rename_column('myapp', 'description', 'frontpage_description')
        db.add_column('myapp', 'resourcepage_description', self.gf('myfields.TextField')(default='CHANGEME'), keep_default=False)

    def backwards(self, orm):
        db.rename_column('myapp', 'frontpage_description', 'description')
        db.delete_column('myapp', 'resourcepage_description')

    models = {
        # ...

我想知道的部分是self.gf(...)(default='CHANGEME'),我想知道是否有办法将descriptionfrontpage_description 的值设置为resourcepage_description 的默认值?

我查看了orm 参数,它确实允许您在迁移期间访问模型,但我遇到的所有示例都涉及在迁移期间使用它来定义关系,而不是实际访问单个记录。

我是否只需将其拆分为模式迁移和数据迁移?

【问题讨论】:

    标签: python django django-south


    【解决方案1】:

    这正是一个三步:添加列的架构迁移,设置它们的数据迁移,以及删除原始description 列的另一个架构迁移。其中 90% 是通过 ./manage 命令为您完成的,所以这并不是可悲的更多工作。

    【讨论】:

    • 是的,我在这里发帖后不久就意识到我错过了什么:-/。这实际上是一个 2 步的过程,因为我可以运行 db.rename_column 并且只添加 1 列,然后运行这两列的数据迁移。