Создание и применение миграций
Теперь, когда есть модель постов блога, необходимо создать соответствующую таблицу базы данных.
Django идет в комплекте с системой миграции, которая отслеживает внесенные в модели изменения и позволяет их распространять по базе данных.
Команда migrate применяет миграции ко всем приложениям, перечисленным в INSTALLED_APPS. Она синхронизирует базу данных с текущими моделями и существующими миграциями.
Прежде всего необходимо создать первоначальную миграцию модели Post. Выполните следующую ниже команду в командной оболочке из корневого каталога своего проекта:
python manage.py makemigrations blog
Вы должны получить результат, аналогичный приведенному ниже:
(venv) PS D:\Project\mysite> python manage.py makemigrations blog
Migrations for 'blog':
blog\migrations\0001_initial.py
- Create model Post
Внутри каталога миграций приложения blog Django только что создал файл 0001_initial.py.
Эта миграция содержит инструкции SQL по созданию таблицы базы данных для модели Post и определения индекса базы данных для поля publish.
Можно взглянуть на содержимое файла, чтобы увидеть, как определяется миграция. Миграция задает зависимости от других миграций и операций, которые необходимо выполнить в базе данных, чтобы синхронизировать ее с изменениями модели.
Давайте взглянем на исходный код SQL, который Django исполнит в базе данных, чтобы создать таблицы вашей модели.
Команда sqlmigrate принимает имена миграций и возвращает их SQL без его исполнения.
Выполните следующую ниже команду из командной оболочки, чтобы проинспектировать результирующий исходный код SQL вашей первой миграции:
python manage.py sqlmigrate blog 0001
Результат должен выглядеть вот так:
BEGIN;
--
-- Create model Post --
CREATE TABLE "blog_post" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"title" varchar(250) NOT NULL,
"slug" varchar(250) NOT NULL,
"body" text NOT NULL,
"publish" datetime NOT NULL,
"created" datetime NOT NULL,
"updated" datetime NOT NULL,
"status" varchar(2) NOT NULL,
"author_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED);
--
-- Create blog_post_publish_bb7600_idx on field(s) -publish of model post --
CREATE INDEX "blog_post_publish_bb7600_idx" ON "blog_post" ("publish" DESC);
CREATE INDEX "blog_post_author_id_dd7a8485" ON "blog_post" ("author_id");
COMMIT;
Точный результат зависит от используемой вами базы данных.
Приведенный выше результат сгенерирован для SQLite.
Из полученного результата видно, что Django генерирует имена таблиц, комбинируя имя приложения с именем модели, обозначенной в нижнем регистре blog_post.
Кроме того, существует возможность указывать своей модели имя конкретно-прикладной базы данных.
Это делается в Meta классе модели при помощи атрибута db_table.
Django создает автоинкрементный столбец id, используемый в каждой модели в качестве первичного ключа, указав primary_key=True в одном из полей модели, но это поведение можно тоже переопределять.
Столбец id состоит из автоматически увеличивающегося целого числа. Этот столбец соответствует полю id, которое добавляется в модель автоматически.
Создаются следующие два индекса базы данных:
-
индекс в убывающем порядке по столбцу
publish. Мы определили этот индекс явным образом с помощью опцииindexesMetaкласса модели; -
индекс по столбцу
author_id, поскольку поля типаForeignKeyпо умолчанию подразумевают индекс.
Давайте сравним модель Post с соответствующей ей таблицей blog_post базы данных:
На рисунке показано, как поля модели соответствуют столбцам таблицы базы данных.
Давайте синхронизируем базу данных с новой моделью. Примените следующую ниже команду в командной оболочке, чтобы воспользоваться существующими миграциями:
python manage.py migrate
Вы получите результат, который заканчивается следующей ниже строкой:
Applying blog.0001_initial... OK
Мы только что применили миграции приложений, перечисленных в INSTALLED_APPS, включая приложение blog.
После применения миграций база данных отражает текущее состояние моделей.
Если вы внесете в файл models.py любые правки, чтобы добавить, удалить либо изменить поля существующих моделей, либо добавите новые модели, то вам придется создать новые миграции, снова применив команду makemigrations.
Каждая миграция дает Django возможность отслеживать изменения модели. Затем нужно применить миграцию командой migrate, чтобы синхронизировать базу данных с моделями.