Как пропустить операцию django DeleteModel

Я удалил модель, Django создает операцию DeleteModel, которую я хотел бы пропустить, потому что я не хочу удалять таблицу, но я также не хочу, чтобы модель оставалась рядом. Как я могу пропустить удаление таблицы в этом случае, но при этом удалить модель?

Я пробовал закомментировать операцию в файле миграции, но при следующем выполнении команды makemigrations операция создается заново.

Когда вы создаете модель, Django создает таблицу. Если вам не нужна модель, просто удалите и таблицу, я не могу представить сценарий, в котором вам нужна таблица, но не модель для нее. Даже если бы вы могли это сделать, вы не смогли бы больше управлять таблицей после удаления модели (потому что это "путь Django" для CRUD-операций с БД).

Думаю, лучшим подходом будет просто не использовать модель, или модифицировать ее, когда модель понадобится для будущего объекта вашего проекта

Я не вижу проблемы в том, чтобы иметь модель в models.py, которую вы не используете, и которая, таким образом, выступает в качестве держателя места.

Но в любом случае, если вы хотите обойтись без удаления модели, вы можете подключить пользовательский маршрутизатор базы данных, предотвращающий фактическую миграцию:

# app_name/router.py


class PreventMigrationRouter:
    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label == 'my_app_label' and model_name == 'my_model_name':
            return False
        return None

с my_app_label и model_name результат model._meta.app_label и model._meta.model_name модели, которую вы не хотите удалять.

и затем добавьте ваш PreventMigrationRouter в качестве первого маршрутизатора в DATABASE_ROUTER настройку [Django-doc]:

# settings.py

DATABASE_ROUTERS = ['app_name.routers.PreventMigrationRouter']

Помня о потенциальном риске получить состояние базы данных, которое не соответствует вашим моделям, вы, возможно, захотите пересмотреть вопрос об удалении модели и сохранении таблицы.

Однако, если вы хотите продолжить, вы можете использовать флаг --fake при запуске миграции.
Например:

# Generate your migration file
python manage.py makemigrations

# Migration file generated with the name 0005_deletemodelname in the app test

# Fake running the migration
python manage.py migrate --fake test 0005_deletemodelname

Выполнение последующей команды makemigrations не приведет к появлению новой операции DeleteModel, поскольку Django считает, что модель уже отброшена.

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