Django重命名mod上的默认函数

2024-09-30 22:17:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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改名为别的东西。我在中重命名了函数实用程序.py当然,现在迁移失败了,因为某些函数不再存在。如果我手工修改迁移是可行的,但是向我解释的经验法则是你(几乎)从不手工编辑迁移。你知道吗

如何适应这种变化?你必须手工编辑迁移吗?如果我必须运行一个旧版本的代码(比如说我必须在重命名之前的某个时间点签出以前的提交),这不是有问题吗?你知道吗


Tags: 模型importmodelsmigrationsutilssomebazlength
1条回答
网友
1楼 · 发布于 2024-09-30 22:17:06

如果你只有一个数据库,这应该可以。如果你有超过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)
    ]

然后像往常一样运行迁移。你知道吗

如果它似乎不起作用,让我知道。你知道吗

相关问题 更多 >