我有一个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不再存在。如果我手动修改了可行的迁移,但是向我解释的经验法则是,您(几乎)永远不会手动编辑迁移。
有什么方法可以适应这种变化?您必须手动编辑迁移吗?如果我必须运行旧版本的代码(即说我必须在重命名之前的某个时间点签出先前的提交),这不会有问题吗?
答案 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)
]
然后照常运行迁移。
如果它似乎不起作用,请告诉我。