Skip to content

Latest commit

 

History

History
271 lines (177 loc) · 10.9 KB

File metadata and controls

271 lines (177 loc) · 10.9 KB

Модуль 3. Урок 16. Понятие CRUD. Добавление записей в таблицу БД. Модуль django-extensions

Что такое CRUD и зачем он нужен

Когда мы создаем веб-приложение, почти всегда нужно работать с данными — добавлять, редактировать, удалять и просматривать их. Эти четыре действия образуют основу любого взаимодействия с базой данных и называются CRUD:

  • C (Create) — создание записи;
  • R (Read) — чтение данных;
  • U (Update) — обновление существующих записей;
  • D (Delete) — удаление данных.

Можно сказать, что CRUD — это фундамент всех операций с базой данных. Если ты понимаешь CRUD, ты понимаешь, как “живут” данные внутри Django-проекта.

Сегодня мы разберем первую из этих операций — Create, то есть добавление записей в таблицу.

На примере нашего проекта CinemaHub создадим фильмы в базе данных при помощи Django ORM и посмотрим, как это выглядит “под капотом”.


Создание записей в базе через Django ORM

ORM (Object-Relational Mapping) — это инструмент Django, который позволяет работать с базой данных через Python-код, без написания SQL-запросов. Например, вместо того чтобы писать SQL-запрос INSERT INTO movies_movie (...) VALUES (...), мы просто создаем объект класса Movie и сохраняем его.


1. Запускаем интерактивную консоль Django

Для начала нужно открыть Django shell — специальную консоль, в которой можно выполнять команды проекта:

python manage.py shell

💡 Она запускает интерактивную среду Python с доступом ко всем настройкам Django. Это идеальный инструмент для тестирования моделей и ORM-запросов.


2. Импортируем модель Movie

После запуска консоли подключаем нужную модель:

from movies.models import Movie

Теперь у нас есть доступ ко всем полям и методам модели Movie.


3. Создаем объект модели

Первый способ — передать значения прямо при создании объекта:

movie1 = Movie(
    title='Начало',
    description='Фильм Кристофера Нолана о снах и реальности.',
    year=2010,
    is_published=True
)

Пока что объект существует только в оперативной памяти — он не записан в базу данных.

Чтобы его сохранить, нужно вызвать метод .save():

movie1.save()

✅ После этого Django автоматически выполнит SQL-запрос INSERT и добавит запись в таблицу movies_movie.


4. Альтернативный способ — создать и сохранить сразу

Django ORM также позволяет создавать объект и сохранять его одной командой с помощью метода .create():

Movie.objects.create(
    title='Интерстеллар',
    description='Путешествие через червоточину к новым мирам.',
    year=2014,
    is_published=True
)

В этом случае Django сам создаст объект, выполнит SQL-запрос и вернет сохраненный экземпляр.


5. Еще один пример с поэтапным заполнением

movie2 = Movie()
movie2.title = 'Темный рыцарь'
movie2.description = 'История противостояния Бэтмена и Джокера.'
movie2.year = 2008
movie2.is_published = True
movie2.save()

Этот подход может быть удобен, если данные поступают постепенно, например, из формы.


Проверяем результат

После добавления фильмов давай проверим, что они действительно появились в базе.

  1. Запускаем сервер:

    python manage.py runserver
  2. Открываем панель администратора:

    http://127.0.0.1:8000/admin/
    
  3. Переходим в раздел Movies — там должны появиться наши добавленные записи: “Начало”, “Интерстеллар”, “Темный рыцарь”.

💡 Если записи видны в админке — значит, ORM и миграции работают корректно, а база данных синхронизирована с моделями.


Просмотр выполняемых SQL-запросов

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 отправляет в базу.


Улучшенная консоль: IPython

Обычная Python-консоль не всегда удобна — она не поддерживает подсветку, автодополнение и историю команд.

Для комфортной работы стоит установить IPython:

pip install ipython

Теперь при запуске:

python manage.py shell

Django автоматически откроет улучшенную интерактивную среду IPython. Это значительно упрощает эксперименты с моделями и ORM.


Расширенные возможности: модуль django-extensions

Чтобы сделать работу с моделями еще удобнее, установим дополнительное приложение:

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/) и убеждаемся, что записи действительно появились.

Можно также открыть страницу жанра или главную страницу проекта — если в шаблоне выводятся фильмы, они уже должны быть там.


Кратко по шагам

  1. Открыли консоль:

    python manage.py shell
  2. Импортировали модель:

    from movies.models import Movie
  3. Создали объект и сохранили:

    Movie.objects.create(title='Начало', description='Фильм Нолана', year=2010)
  4. Проверили через /admin/, что фильм добавлен.

  5. Установили django-extensions и перешли на shell_plus для удобства.


Вопросы

  1. Что означает аббревиатура CRUD и какие операции она включает?
  2. Чем ORM отличается от прямой работы с SQL-запросами?
  3. В чем разница между save() и create() при добавлении записей?
  4. Как можно посмотреть SQL-запрос, выполненный Django при сохранении объекта?
  5. Для чего нужен модуль django-extensions и команда shell_plus?
  6. Почему полезно использовать ipython при работе с Django shell?
  7. Что произойдет, если создать объект модели, но не вызвать метод .save()?
  8. Как проверить в браузере, что созданная запись действительно добавилась в базу?
  9. Можно ли создавать объекты модели без использования Django админки?
  10. Что происходит “под капотом” при выполнении команды Movie.objects.create()?

Предыдущий урок | Следующий урок