Django ORM скрывает большую сложность при разработке веб-приложения. Объявление модели данных и шаблон запроса упрощены, тогда как за кулисами они структурированы по-другому. Данный раздел в блоге объяснит работу Django ORM (а не только преобразование кода Python в SQL), объявление модели, запросы (менеджер, набор запросов), поддержку нескольких драйверов, написание пользовательских запросов, миграции и т. д.
from django.db import models
class Employee(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
Класс модели Employee является производным от models.Model. Наследование Model сигнализирует Django о том, что во время выполнения класс является моделью базы данных.
Модель (позже преобразованная в таблицу) содержит две дополнительные переменные класса first_name и last_name, которые будут двумя столбцами в таблице. Их тип указывается путем создания экземпляра соответствующего типа полей, здесь models.CharField.
Чтобы в дальнейшем, для взаимодействия с таблицей hr_employee можно было запустить команду shell_plus, которая идет в пакете django-extensions, установим этот пакет:
pip install django-extensions
Обратите внимание, что Django предоставляет вам встроенную shell команду. Однако с shell_plus командой удобнее работать, например, она автоматически загружает определенные в проекте модели и отображает сгенерированный SQL.
Добавим django-extensions в файл settings.py:
INSTALLED_APPS = [
# ...
'django_extensions',
'hr',
]
Выполните миграцию с помощью команды:
python manage.py makemigrations
Добавим изменения в базу данных с помощью команды migrate:
python manage.py migrate
Django создает множество таблиц, в том числе для встроенных моделей, таких как User и Group. Но пока мы сосредоточимся на классе Employee.
Мы видим что таблица в БД заполнилась и создалась наша таблица hr_employee:
Откатить миграцию Django с помощью команды migrate
Чтобы отменить миграцию, мы можем использовать команду migrate, которую предоставляет нам файл manage.py.
Рассмотрим приложение Django hr и файлы миграции в папке migrations этого приложения. Пусть два файла миграции будут 0005_second_last_migration и 0006_last_migration; обратите внимание, что 0006 - это последняя примененная миграция.
Если нам нужно вернуться к миграции 0005 из миграции 0006, мы выполним следующую команду:
python manage.py migrate hr 0005
Или:
python manage.py migrate hr 0005_second_last_migration
Необходимо указать имя приложения, и мы можем использовать как номер миграции, так и имя файла, чтобы отменить миграцию.
Если нам нужно отменить все миграции приложения hr, мы воспользуемся следующей командой:
python manage.py migrate hr zero
Помните, что иногда миграция может быть необратимой. Как правило, это состояние возникает, когда в модели Django были внесены некоторые существенные изменения. Когда мы попытаемся вернуться к такой миграции, Django выдаст IrreversibleError.
Если нам нужно полностью очистить всю базу данных, мы можем использовать следующую команду:
python manage.py flush