Итак, у нас уже есть модели, описанные в коде. Но как превратить эти определения в реальные строки в базе данных? Django ORM предельно упрощает эту задачу. Добавление данных сводится к созданию объекта модели и вызову метода .save().
Основной процесс
Для начала разберёмся с базовым процессом. Мы будут работать с примером модели Book, которая может выглядеть так:
# models.py
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
published_date = models.DateField()
isbn = models.CharField(max_length=13, unique=True)
pages = models.PositiveIntegerField()
def __str__(self):
return self.title
Эта модель описывает таблицу для хранения информации о книгах. Теперь создадим новую запись.
Создание объекта модели в Python
Для добавления записи мы можем воспользоваться следующим кодом:
# Открываем Django shell
$ python manage.py shell
А затем вводим:
# Импортируем модель
from myapp.models import Book
# Создаём объект, но пока НЕ сохраняем его в базе
book = Book(
title="Автостопом по галактике",
author="Дуглас Адамс",
published_date="1979-10-12",
isbn="9780345391803",
pages=224
)
# Сохраняем запись в базе данных
book.save()
При вызове book.save() Django отправляет SQL-запрос для добавления записи в базу данных. После этого запись попадает в таблицу, и ей присваивается уникальный идентификатор, который Django хранит в поле id.
Метод .create()
Поскольку создание и сохранение объекта — это довольно частая операция, Django предоставляет специальный метод .create(), который объединяет эти шаги. Например:
Book.objects.create(
title="1984",
author="Джордж Оруэлл",
published_date="1949-06-08",
isbn="9780451524935",
pages=328
)
Метод create() делает сразу всё: получает данные, создаёт объект и сохраняет его в базе. Это упрощение имеет значение, когда нужно добавить несколько записей подряд.
Работа с атрибутами модели
При создании записи мы можем указать значения только для тех полей, которые обязательны required. Значения для полей с атрибутами default или null=True можно не указывать, Django подставит их автоматически.
Допустим, мы добавили к нашей модели поле genre с атрибутом default:
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
published_date = models.DateField()
isbn = models.CharField(max_length=13, unique=True)
pages = models.PositiveIntegerField()
genre = models.CharField(max_length=50, default="Uncategorized")
Теперь, если мы создадим объект без указания значения для genre, Django присвоит ему значение "Uncategorized":
# Создание записи с использованием значения по умолчанию
book = Book(
title="Философия Java",
author="Брюс Эккель",
published_date="2006-12-15",
isbn="9780131872486",
pages=1136
)
book.save()
# Проверяем поле genre
print(book.genre) # Вывод: "Uncategorized"
Добавление записей в больших количествах
Если вам нужно добавить сразу несколько записей, лучше использовать методы оптимизации. Например, bulk_create. Этот метод позволяет вставить множество записей в базу за один SQL-запрос.
books = [
Book(
title="Мастер и Маргарита",
author="Михаил Булгаков",
published_date="1967-11-01",
isbn="9780679603070",
pages=384
),
Book(
title="Три товарища",
author="Эрих Мария Ремарк",
published_date="1936-04-30",
isbn="9780449912423",
pages=499
)
]
# Используем bulk_create для добавления записей
Book.objects.bulk_create(books)
bulk_create значительно повышает производительность, поскольку отправляет один SQL-запрос вместо многократных запросов при использовании create().
Проверка добавления данных
После добавления данных имеет смысл убедиться, что они действительно находятся в базе. Для этого можно использовать метод .all(), возвращающий все записи из таблицы:
# Получаем все записи из базы
all_books = Book.objects.all()
# Выводим названия книг
for book in all_books:
print(book.title)
Если вы видите свои записи в консоли, значит, всё работает корректно.
Возможные ошибки и как их избежать
При добавлении данных через модели можно столкнуться с несколькими типичными ошибками:
Ошибка уникальности (
IntegrityError): если вы пытаетесь добавить запись с уже существующим значением в полеisbn(которое уникально), Django выброситIntegrityError. Решение простое: перед добавлением данных убедитесь, что значения уникальных полей не пересекаются.Пропуск обязательных полей: если вы не указываете значение для поля без
null=Trueилиdefault, Django бросит исключение. Чтобы этого избежать, всегда указывайте значения для обязательных полей.Некорректные значения: например, если вы укажете текст вместо числа для
pages, произойдёт ошибка. Всегда следите за тем, чтобы типы данных соответствовали требованиям полей.
Практическое задание
Шаг 1: создайте несколько записей
- Используя метод
.create(), добавьте 5 книг в базу данных. - Используйте Django shell для выполнения задания.
Шаг 2: проверьте данные
- Получите список всех книг с помощью
.all()и выведите их в консоли. - Напишите небольшой цикл, который выведет автора каждой книги.
Шаг 3: используйте bulk_create
- Напишите скрипт, который добавит 3 книги за один запрос, используя
bulk_create.
Зачем это нужно?
"Почему ORM лучше, чем просто SQL?" — этот вопрос можно часто услышать на собеседованиях. Умение работать с ORM показывает ваш профессионализм и понимание высокоуровневых абстракций. В реальной жизни добавление данных в базу — это повседневная задача, будь то заполнение новой таблицы или работа с данными пользователей. Использование Django ORM упрощает процесс и уменьшает вероятность ошибок.
Кроме того, умение работать с ORM — это навык, который пригодится вам за пределами Django, так как многие популярные фреймворки (например, FastAPI с SQLAlchemy) используют похожие подходы.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ