Невозможно сохранить измененный models.py из-за (уже примененного) файла миграции - Django 3

Ранее я добавил 2 функции в models.py для пути загрузки. Но позже я заметил, что эти две функции похожи.

def upload_path(instance, fl_file_name):
    supplier = str(instance.fl_supplier).replace(' ', '-')
    return ('sources/{0}/{1}'.format(supplier.lower(), fl_file_name))


def upload_path_stock(instance, fl_file_name):
    supplier = str(instance.fl_st_supplier).replace(' ', '-')
    return ('sources/{0}/{1}'.format(supplier.lower(), fl_file_name))

Чуть ниже моя модель была написана так

class Flow(models.Model):
[...]
    fl_file_name = models.FileField(
        max_length=50, upload_to=upload_path_stock, verbose_name='Nom fichier')

Я попытался закомментировать функцию def upload_path_stock и изменил свойство моей модели следующим образом :

class Flow(models.Model):
[...]
    fl_file_name = models.FileField(
        max_length=50, upload_to=upload_path, verbose_name='Nom fichier') # <<<< HERE

Но при сохранении возникла ошибка :

File "/Users/[...]/migrations/0063_auto_20220822_1834.py", line 27, in Migration field=models.FileField(max_length=50, upload_to=flows.models.upload_path_stock, verbose_name='Nom fichier'), AttributeError: модуль 'flows.models' не имеет атрибута 'upload_path_stock'

Эта строка предотвращает сохранение сохраняемого файла, поскольку в ней упоминается upload_path_stock:

migrations.AlterField(
            model_name='flowstock',
            name='fl_st_file_name',
            field=models.FileField(max_length=50, upload_to=flows.models.upload_path_stock, verbose_name='Nom fichier'),
        ),

Поэтому я откомментировал ненужную функцию и снова приступил к новой миграции. Теперь последней миграцией является #64. Но даже если применена миграция 64, ошибка все еще упоминается в 63, когда я снова закомментировал функцию и попытался сохранить модель.

Могу ли я изменить новый путь непосредственно в файле миграции 63 или мне следует использовать другой, более безопасный способ

Вы можете просто удалить все миграции внутри файла миграции. Я бы рекомендовал сделать это для всех приложений, связанные модели не любят, когда отношения исчезают из миграций. Не удаляйте ни сам файл migrations, ни файл __init__.py внутри него.

Итак, просто удалите их, сделайте миграцию и мигрируйте снова.

Это должно быть безопасно, но на всякий случай сначала сделайте резервную копию базы данных.

Из всего, на что вы ссылаетесь, я думаю, что вы можете столкнуться с этой проблемой:

Ссылки на функции в опциях полей, таких как upload_to и limit_choices_to и объявления менеджеров моделей с менеджерами, имеющими use_in_migrations = True сериализуются в миграциях, поэтому функции и классы должны быть сохранены до тех пор, пока существует пока существует миграция, ссылающаяся на них. Любые пользовательские поля модели также необходимо сохранить, так как они импортируются непосредственно миграциями.

Source (то же самое для вашей версии django)

Так как я всегда стараюсь придерживаться документации, я сохраняю код и помечаю его предупреждением do-not-delete-warning и комментарием, ссылающимся на эти строки в документации. Да, это кажется уродливым, но если у вас нет возможности вручную вмешиваться в файлы миграции, например, сминать или возвращать, то это кажется решением.

Вернуться на верх