Отже, у нас вже є моделі, описані в коді. Але як перетворити ці визначення на реальні рядки в базі даних? 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) використовують схожі підходи.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ