【问题标题】:Django rename default function on modelDjango重命名模型上的默认函数
【发布时间】:2018-10-15 23:51:48
【问题描述】:

我有一个如下所示的 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 不再存在。如果我手动修改迁移可行,但向我解释的经验法则是您(几乎)永远不要手动编辑迁移。

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

【问题讨论】:

  • 运行python manage.py makemigrations,这将重建你的模型。
  • 您的models 中是否已有需要保存的信息?
  • @CarlBrubaker 我没有,这是我最终利用的:我删除了这个迁移并重新创建了它,从数据库中转储了所有内容。不过,这显然不是一个可持续的策略,所以我想学习处理这种情况的最佳实践。
  • @wanderer0810 我确实运行了 makemigrations,这是由于 some_func 不再存在而导致的错误。
  • 您可以进行双重迁移:1 删除字段,然后再次添加。或者您可能必须编写一些方法来查找所有设置了 some_func 的对象并将其更改为其他内容。

标签: python django django-migrations


【解决方案1】:

如果您只有 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)
    ]

然后像往常一样运行迁移。

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

【讨论】:

    猜你喜欢
    • 2020-01-10
    • 2021-06-05
    • 2011-07-23
    • 2015-11-10
    • 1970-01-01
    • 2018-10-22
    • 2016-01-06
    • 1970-01-01
    • 2011-09-03
    相关资源
    最近更新 更多