Что делает команда `makemigrations` в Django?

Ответ

Команда python manage.py makemigrations в Django используется для обнаружения изменений в моделях проекта и генерации новых файлов миграций, которые описывают эти изменения.

Подробный процесс:

  1. Сканирование моделей: Django сканирует все файлы models.py в установленных приложениях проекта, чтобы получить текущее состояние всех моделей (классов, унаследованных от django.db.models.Model).
  2. Сравнение с историей миграций: Он сравнивает текущее состояние моделей с их состоянием, зафиксированным в последней примененной миграции для каждого приложения (или с начальным состоянием, если миграций нет). Django использует внутренний механизм для отслеживания изменений в полях, метаданных и отношениях моделей.
  3. Обнаружение изменений: Если обнаружены различия (например, добавление нового поля, изменение типа поля, удаление модели, изменение отношений), Django определяет необходимые операции для приведения схемы базы данных в соответствие с новыми моделями.
    • Примеры операций: CreateModel (создание таблицы), AddField (добавление столбца), AlterField (изменение столбца), DeleteModel (удаление таблицы).
  4. Генерация файла миграции: Создается новый Python-файл в директории migrations/ соответствующего приложения (например, 000X_auto_YYYYMMDD_HHMM.py). Этот файл содержит класс Migration с атрибутом operations, который перечисляет обнаруженные изменения в виде Python-кода.

    # Пример содержимого файла миграции
    from django.db import migrations, models
    
    class Migration(migrations.Migration):
    
        dependencies = [
            ('myapp', '0001_initial'), # Зависимость от предыдущей миграции
        ]
    
        operations = [
            migrations.AddField(
                model_name='user',
                name='age',
                field=models.IntegerField(default=0),
            ),
        ]
  5. Вывод информации: В консоль выводится информация о созданных миграциях и обнаруженных изменениях, например: Migrations for 'myapp': myapp/migrations/0002_add_age_to_user.py.

Важно: Команда makemigrations только генерирует файлы миграций. Она не вносит никаких изменений в базу данных. Для применения этих изменений к базе данных необходимо выполнить команду python manage.py migrate.