Django переименовать функцию по умолчанию на модели - PullRequest
0 голосов
/ 16 октября 2018

У меня была модель 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 голосов
/ 16 октября 2018

Если у вас есть только 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)
    ]

Затем запустите ваши миграции как обычно.

Если это не помогло, дайте мне знать.

...