Django重命名模型上的默认功能

时间:2018-10-15 23:51:48

标签: python django django-migrations

我有一个Django模型,如下所示:

class Foobar(models.Model):
    baz = models.CharField(max_length=12, default=some_func)

some_func存在于文件/someproj/utils/utils.py

这很好,一切都很好。我为此模型创建了迁移,并按预期工作。迁移大致如下:

from __future__ import unicode_literals

from django.db import migrations, models
import someproj.utils.utils


class Migration(migrations.Migration):

    dependencies = [("someproj", "0008_auto_20180928_0002")]

    operations = [
        migrations.CreateModel(
            name="Foobar",
            fields=[
                (
                    "baz",
                    models.CharField(
                        default=someproj.utils.utils.some_func,
                        max_length=12,
                        serialize=False,
                    ),
                ),
            ],
        )
    ]

然后我后来意识到我想将some_func重命名为其他名称。我在utils.py中重命名了该函数,现在当然迁移失败了,因为some_func不再存在。如果我手动修改了可行的迁移,但是向我解释的经验法则是,您(几乎)永远不会手动编辑迁移。

有什么方法可以适应这种变化?您必须手动编辑迁移吗?如果我必须运行旧版本的代码(即说我必须在重命名之前的某个时间点签出先前的提交),这不会有问题吗?

1 个答案:

答案 0 :(得分:0)

如果您只有1个数据库,则应该可以使用。如果您大于1,则不确定。

首先编写用于处理字段默认值的方法:

def rewrite_field_default(self):
    for object in Foobar.objects.all()
        object.baz = some_func
        object.save()

进行空迁移:

python3 manage.py makemigrations --empty app

然后,您可以将其导入迁移中。

operations = [
        migrations.RunPython(rewrite_field_default)
    ]

然后照常运行迁移。

如果它似乎不起作用,请告诉我。