🐍🎸 Курс Django. Часть 2: ORM и основы работы с базами данных
Создаем базу данных на основе моделей, рассматриваем способы наполнения БД с использованием loaddata и скриптов. Передаем данные на фронтенд с помощью функциональных представлений и шаблонов.
Для создания базы данных (и всех взаимодействий с ней) Django использует ORM (объектно-реляционное представление). ORM – это своеобразная прослойка, которая позволяет работать с базой данных, используя классы и методы вместо написания сложных SQL-запросов.
Вот основные возможности и преимущества использования ORM в Django:
- Моделирование базы данных. Разработчик определяет структуру таблиц, их поля и взаимосвязи между ними с помощью специальных классов – моделей.
- Отношения и связи. Связывание моделей различными типами отношений (один-к-одному, один-ко-многим и многие-ко-многим) в ORM выполняется очень просто.
- Простой доступ к данным. Запросы к базе данных выполняются с помощью простого и понятного синтаксиса вместо языка SQL.
- Гибкое обновление структуры базы данных. С помощью миграций ORM мгновенно изменяет структуру базы данных в соответствии с изменениями в моделях.
- Автоматическая валидация данных. ORM предусматривает несколько способов автоматической валидации данных в соответствии с определенными правилами и ограничениями.
- Защита от SQL-инъекций. Код SQL запроса определяется отдельно от параметров запроса.
- Переносимость – можно легко переключаться между разными базами данных, не меняя код приложения.
- Кеширование запросов для повышения производительности.
- Разнообразная дополнительная функциональность – ORM предоставляет готовые решения для работы с данными: создание и изменение объектов, выборки, агрегации, пагинация и т.д. Не нужно все это программировать вручную.
Недостатки у ORM тоже есть, но их гораздо меньше, чем преимуществ:
- Снижение производительности. ORM добавляет накладные расходы, так как создает дополнительный слой абстракции над базой данных. В некоторых случаях использование ORM может привести к уменьшению производительности из-за неоптимальных запросов.
- Для написания сложных запросов (и для оптимизации часто повторяющихся, ресурсоемких операций) могут потребоваться Q и F-объекты.
- В некоторых случаях сложные запросы нужно писать вручную на SQL.
Модели в Django
Модели в Django представляют собой классы Python, которые описывают структуру, свойства и взаимосвязи таблиц в базе данных. Модели не только играют ключевую роль в создании и управлении схемой базы данных, но также обеспечивают удобный интерфейс для работы с данными.
Модели содержат поля, которые представляют столбцы в таблице БД. Эти поля определяют тип данных, валидацию и другие свойства для хранения, извлечения и обновления данных. Например, поле типа CharField может описывать строковое значение, поле типа DateField – дату, а поле типа ForeignKey – отношение типа один-ко-многим между таблицами. Кроме полей, для модели можно определять метаданные, методы, менеджеры для выборки и фильтрации данных.
Связи между моделями
Основные типы связей между моделями – один-к-одному, один-ко-многим, многие-ко-многим. Рассмотрим на примерах.
Один-к-одному (OneToOne) – это связь одной записи в одной таблице с одной записью в другой таблице. Например, один пользователь может иметь только один профиль:
Один-ко-многим (ForeignKey) – это связь одной записи в одной таблице со многими записями в другой. Например, один автор может написать несколько книг:
Многие-ко-многим (ManyToMany) – это связь между произвольным количеством записей в двух таблицах. Например, одна книга может принадлежать к нескольким жанрам сразу, а к одному жанру относится множество книг:
Создание базы данных в Django
Для создания базы данных в Django нужно:
- Создать первичную базу с помощью команды migrate.
- Создать аккаунт суперпользователя (админа) командой createsuperuser.
- Написать модели, определяющие нужную структуру БД.
- Подготовить и выполнить миграции – makemigrations и migrate.
Выполним все эти действия шаг за шагом.
Инициализация базы данных
Django по умолчанию использует SQLite, и для подключения этой базы к приложению (в отличие от других баз типа MySQL и PostgreSQL) не нужно делать никаких специальных настроек. Как только вы создали проект и приложение в нем, можно выполнить команду migrate
, что приведет к появлению базы данных db.sqlite3 на одном уровне с директорией приложения и файлом manage.py:
Структура проекта теперь выглядит так:
Добавьте приложение myapp в config/settings.py:
Создание структуры базы данных
Сохраните в файле myapp/models.py модели Author, Genre и Book:
Теперь можно подготовить миграции (изменения в структуре) БД:
И применить миграции к структуре БД:
В базе данных появились соответствующие таблицы Author, Genre и Book. Вот какие значения там можно сохранять:
- CharField – строка ограниченной длины, для небольших текстовых значений вроде имен и названий.
- TextField – неограниченный текст, для мультистрочных текстов вроде подробных описаний.
- DateField – дата, хранится в формате ГГГГ-ММ-ДД.
- IntegerField – целочисленное значение.
- DecimalField – число с плавающей точкой, для денежных значений. Это более точный формат, чем FloatField.
- ForeignKey – ссылка на другую модель, связь один-ко-многим.
- ManyToManyField – связь многие-ко-многим.
- BooleanField – логическое значение True или False.
У моделей могут быть и другие поля – например, FileField для хранения ссылки на текстовый или аудиофайл книги, ImageField для ссылки на изображение обложки. Надо заметить, что файлы в базе данных обычно не хранят (хотя это возможно) – в соответствующих файлам полях сохраняются только ссылки на файлы, которые, в свою очередь, физически находятся в директории media и других служебных папках.
Регистрация моделей в панели управления Django
Чтобы с моделями можно было работать в админке Django, нужно их зарегистрировать в файле myapp/admin.py:
Это самый простой способ представления моделей в админке, есть и более удобные. Например, так можно обеспечить вывод полей Book прямо на странице Author:
Теперь можно запустить сервер, зайти в админку и посмотреть на визуальное представление базы данных:
Панель управления Django доступна по адресу http://127.0.0.1:8000/admin:
Класс Meta
Русскоязычные названия для моделей, порядок вывода записей, ограничения по уникальности и многое другое можно определить с помощью класса Meta:
Заполнение базы
Наполнить БД информацией можно несколькими способами:
- Вручную в админке. Панель управления Django является, по сути, удобным визуальным GUI для CRUD-операций. Но записи придется вводить по одной.
- В интерактивной оболочке (shell) Django. Так можно ввести сколько угодно записей за раз, однако набирать их придется вручную, а после каждого неверного отступа процесс нужно будет начинать сначала. В shell также можно загрузить данные из файла, ниже мы рассмотрим этот способ.
- С помощью команды loaddata и данных из заранее подготовленного json-файла, структура которого соответствует схеме БД.
- С помощью Python-скрипта, который может загрузить данные из любого файла (json, csv, xlsx), придать им нужную структуру и сохранить в базе. Такие скрипты можно выполнять в shell и в cmd.
Самый удобный из этих способов – загрузка с loaddata:
- Сначала нужно создать директорию fixtures в папке приложения, то есть myapp/fixtures.
- В директорию fixtures нужно поместить готовый json-файл с данными.
- После чего надо выполнить команду
python manage.py loaddata data.json
.
Запустите сервер, зайдите в админку – теперь там есть 3 жанра, 3 книги и 3 писателя:
А так можно добавлять записи в БД в интерактивной оболочке Django:
Результат – в базу добавлены записи о писателе Дэне Симмонсе, его книге «Террор», и одном из жанров, к которым относится эта книга – триллер:
Еще один способ – загрузка данных из скрипта, выполненного в shell:
- Сохраните скрипт add_data.py на одном уровне с manage.py.
- Запустите оболочку командой
python manage.py shell
. - Выполните команду
exec(open("add_data.py", encoding="utf-8").read())
.
Готово – в базе данных появились записи о двух новых авторах, книгах и жанрах:
Получение данных из БД
Все основные манипуляции с данными в Django происходят в представлениях, которые находятся в файле views.py. Представления делятся на функциональные и классовые. Представления на основе классов имеют несколько весомых преимуществ по сравнению с функциональными, и в дальнейшем мы подробно их рассмотрим.
Сохраните эти функциональные представления в myapp/views.py:
Представления передают в шаблоны все записи об авторах, книгах и жанрах. В действие эти представления приводят маршруты. Сохраните эти маршруты в файле myapp/urls.py:
И добавьте маршруты myapp в config/urls.py:
Теперь нужно создать директорию templates внутри myapp и сохранить в ней эти шаблоны:
Все готово – запускайте сервер, переходите по ссылкам-маршрутам:
- http://127.0.0.1:8000/authors/
- http://127.0.0.1:8000/books/
- http://127.0.0.1:8000/genres/
Подведем итоги
Мы рассмотрели:
- Принцип создания базы данных с помощью моделей ORM.
- Способы заполнения БД с использованием loaddata, команды create() и скрипта, запускаемого в интерактивной оболочке shell.
- Простейшие представления на основе функций.
- Механизм передачи данных из БД на фронтенд.
Представления могут выполнять гораздо более сложные манипуляции с данными, чем передачу в шаблоны всех существующих в базе записей. Со всеми возможностями представлений мы разберемся в последующих главах и курсовых проектах.
Весь код и база данных, использованные в этой статье, находятся здесь.
Содержание курса
- Часть 1: Django — что это? Обзор и установка фреймворка, структура проекта
- Проект 1: Веб-приложение на основе XLSX вместо базы данных
- Часть 2: ORM и основы работы с базами данных
- Проект 2: Портфолио разработчика