Когда мы создаем веб-приложение, почти всегда нужно работать с данными — добавлять, редактировать, удалять и просматривать их. Эти четыре действия образуют основу любого взаимодействия с базой данных и называются CRUD:
- C (Create) — создание записи;
- R (Read) — чтение данных;
- U (Update) — обновление существующих записей;
- D (Delete) — удаление данных.
Можно сказать, что CRUD — это фундамент всех операций с базой данных. Если ты понимаешь CRUD, ты понимаешь, как “живут” данные внутри Django-проекта.
Сегодня мы разберем первую из этих операций — Create, то есть добавление записей в таблицу.
На примере нашего проекта CinemaHub создадим фильмы в базе данных при помощи Django ORM и посмотрим, как это выглядит “под капотом”.
ORM (Object-Relational Mapping) — это инструмент Django, который позволяет работать с базой данных через Python-код, без написания SQL-запросов.
Например, вместо того чтобы писать SQL-запрос INSERT INTO movies_movie (...) VALUES (...),
мы просто создаем объект класса Movie и сохраняем его.
Для начала нужно открыть Django shell — специальную консоль, в которой можно выполнять команды проекта:
python manage.py shell💡 Она запускает интерактивную среду Python с доступом ко всем настройкам Django. Это идеальный инструмент для тестирования моделей и ORM-запросов.
После запуска консоли подключаем нужную модель:
from movies.models import MovieТеперь у нас есть доступ ко всем полям и методам модели Movie.
Первый способ — передать значения прямо при создании объекта:
movie1 = Movie(
title='Начало',
description='Фильм Кристофера Нолана о снах и реальности.',
year=2010,
is_published=True
)Пока что объект существует только в оперативной памяти — он не записан в базу данных.
Чтобы его сохранить, нужно вызвать метод .save():
movie1.save()✅ После этого Django автоматически выполнит SQL-запрос INSERT и добавит запись в таблицу movies_movie.
Django ORM также позволяет создавать объект и сохранять его одной командой с помощью метода .create():
Movie.objects.create(
title='Интерстеллар',
description='Путешествие через червоточину к новым мирам.',
year=2014,
is_published=True
)В этом случае Django сам создаст объект, выполнит SQL-запрос и вернет сохраненный экземпляр.
movie2 = Movie()
movie2.title = 'Темный рыцарь'
movie2.description = 'История противостояния Бэтмена и Джокера.'
movie2.year = 2008
movie2.is_published = True
movie2.save()Этот подход может быть удобен, если данные поступают постепенно, например, из формы.
После добавления фильмов давай проверим, что они действительно появились в базе.
-
Запускаем сервер:
python manage.py runserver
-
Открываем панель администратора:
http://127.0.0.1:8000/admin/ -
Переходим в раздел Movies — там должны появиться наши добавленные записи: “Начало”, “Интерстеллар”, “Темный рыцарь”.
💡 Если записи видны в админке — значит, ORM и миграции работают корректно, а база данных синхронизирована с моделями.
Django позволяет посмотреть, какие SQL-запросы фактически выполняются. Это полезно, чтобы понять, что именно делает ORM “под капотом”.
После создания или сохранения объекта можно вывести список запросов:
from django.db import connection
print(connection.queries)Результат будет примерно таким:
[{'sql': "INSERT INTO 'movies_movie' ('title', 'description', 'year', 'is_published') VALUES ('Начало', 'Фильм Кристофера Нолана...', 2010, 1)", 'time': '0.001'}]Таким образом ты можешь видеть реальные SQL-команды, которые Django отправляет в базу.
Обычная Python-консоль не всегда удобна — она не поддерживает подсветку, автодополнение и историю команд.
Для комфортной работы стоит установить IPython:
pip install ipythonТеперь при запуске:
python manage.py shellDjango автоматически откроет улучшенную интерактивную среду IPython. Это значительно упрощает эксперименты с моделями и ORM.
Чтобы сделать работу с моделями еще удобнее, установим дополнительное приложение:
pip install django-extensionsДобавляем его в INSTALLED_APPS в файле settings.py:
INSTALLED_APPS = [
...,
'django_extensions',
]Теперь у нас появляется новая команда — shell_plus, которая:
- автоматически импортирует все модели проекта;
- может отображать SQL-запросы в реальном времени.
Запускаем так:
python manage.py shell_plus --print-sqlТеперь можно писать, например:
movie = Movie(title='Дюна', description='Эпическая сага по роману Герберта', year=2021)
movie.save()И прямо в консоли ты увидишь SQL-запрос:
INSERT INTO "movies_movie" ("title", "description", "year", "is_published", "time_create", "time_update")
VALUES ('Дюна', 'Эпическая сага по роману Герберта', 2021, 1, '2025-10-20 12:00:00', '2025-10-20 12:00:00');Это отличный способ наблюдать, как ORM превращает Python-код в SQL.
После добавления нескольких фильмов через ORM снова открываем панель администратора (/admin/) и убеждаемся, что записи действительно появились.
Можно также открыть страницу жанра или главную страницу проекта — если в шаблоне выводятся фильмы, они уже должны быть там.
-
Открыли консоль:
python manage.py shell
-
Импортировали модель:
from movies.models import Movie
-
Создали объект и сохранили:
Movie.objects.create(title='Начало', description='Фильм Нолана', year=2010)
-
Проверили через
/admin/, что фильм добавлен. -
Установили
django-extensionsи перешли наshell_plusдля удобства.
- Что означает аббревиатура CRUD и какие операции она включает?
- Чем ORM отличается от прямой работы с SQL-запросами?
- В чем разница между
save()иcreate()при добавлении записей? - Как можно посмотреть SQL-запрос, выполненный Django при сохранении объекта?
- Для чего нужен модуль
django-extensionsи командаshell_plus? - Почему полезно использовать
ipythonпри работе с Django shell? - Что произойдет, если создать объект модели, но не вызвать метод
.save()? - Как проверить в браузере, что созданная запись действительно добавилась в базу?
- Можно ли создавать объекты модели без использования Django админки?
- Что происходит “под капотом” при выполнении команды
Movie.objects.create()?