У процесі роботи з веб-додатком ми постійно створюємо або оновлюємо дані — чи то користувач, стаття блогу або замовлення в інтернет-магазині. Сьогодні ми дізнаємося, як створювати об'єкти за допомогою Django ORM. Іншими словами, ми навчимося додавати дані в базу через Python-код — елегантно та ефективно.
У реальних проєктах це скрізь: реєстрація нових користувачів, створення записів у блозі, додавання товарів у каталог, запис метрик або логування подій. Усе це — про створення об'єктів.
Основи створення об'єктів
Django ORM надає простий і інтуїтивно зрозумілий спосіб додавання записів у базу даних. Ми будемо використовувати модель, яку створили на минулих лекціях. Наприклад, у нас є модель Book, яка представляє книги в бібліотеці:
# models.py
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
publication_date = models.DateField()
isbn = models.CharField(max_length=13, unique=True)
price = models.DecimalField(max_digits=10, decimal_places=2)
Спосіб 1: Використання Model.objects.create()
Найпростіший спосіб додати запис — це метод create().
# Створюємо нову книгу
from library.models import Book
book = Book.objects.create(
title="Війна і мир",
author="Лев Толстой",
publication_date="1869-01-01",
isbn="9780679783305",
price=500.00
)
print(book)
# <Book: Війна і мир>
Що відбувається?
- Ми передаємо параметри для всіх *обов'язкових полів моделі.*
- Django автоматично створює запис у базі і повертає екземпляр цього запису (об'єкт).
- Новий рядок вже додано в таблицю бази даних.
Швидко, зручно, як кава з автомата.
Спосіб 2: Створення об'єкта та виклик .save()
Цей метод трохи довший, але іноді більш гнучкий. Ми спочатку створюємо екземпляр моделі, а потім явно зберігаємо його.
# Створюємо об'єкт книги, але поки не зберігаємо в базі
book = Book(
title="Злочин і кара",
author="Федір Достоєвський",
publication_date="1866-01-01",
isbn="9780679734505",
price=300.00
)
# Змінюємо дані перед збереженням
book.price = 250.00
# Зберігаємо об'єкт у базі даних
book.save()
print(book.id)
# 2 (ID об'єкта, автоматично виставлений базою даних)
Коли використовувати .save()?
Цей спосіб корисний, якщо ти хочеш підготувати об'єкт перед збереженням. Наприклад:
- Змінити значення після створення.
- Додати обчислювані значення перед збереженням.
- Використовувати обробники сигналів (наприклад,
pre_save).
Що робити з нульовими та необов'язковими полями?
Якщо у поля моделі задано властивість null=True або blank=True, то ти можеш пропустити його при створенні об'єкта. Django встановить значення NULL у базі або залишить поле порожнім.
# Приберемо необов'язкові поля
book = Book.objects.create(
title="Майстер і Маргарита",
author="Михайло Булгаков",
publication_date="1967-01-01",
isbn="9780141180144"
)
print(book.price)
# None
Проте, якщо ти спробуєш не вказати обов'язкове поле, то чекай помилки IntegrityError або TypeError.
Робота з унікальними полями
Коли ти створюєш об'єкт з полем, позначеним як unique=True (наприклад, isbn у нашому прикладі), Django ORM перевіряє, щоб значення було унікальним. Якщо таке значення вже існує в базі, ти отримаєш помилку.
# Спробуємо додати дві однакові книги
Book.objects.create(
title="1984",
author="Джордж Орвелл",
publication_date="1949-06-08",
isbn="9780451524935",
price=350.00
)
# Помилка! ISBN вже існує
Book.objects.create(
title="Нова книга",
author="Інший Автор",
publication_date="2023-10-12",
isbn="9780451524935",
price=400.00
)
# django.db.utils.IntegrityError: UNIQUE constraint failed: book.isbn
Щоб уникнути подібних ситуацій, спершу варто перевіряти наявність об'єкта в базі. Для цього можна використовувати метод get_or_create().
Спосіб 3: Використання get_or_create()
Метод get_or_create() дозволяє:
- Знайти існуючий запис, якщо він вже є в базі.
- Створити новий запис, якщо такого немає.
book, created = Book.objects.get_or_create(
isbn="9780451524935",
defaults={
"title": "1984",
"author": "Джордж Орвелл",
"publication_date": "1949-06-08",
"price": 350.00
}
)
if created:
print("Нова книга додана:", book)
else:
print("Книга вже існує:", book)
Як це працює?
- Django шукає запис за вказаними критеріями (
isbn="9780451524935"). - Якщо запис знайдено, метод повертає його і встановлює
created = False. - Якщо запису немає, створюється новий із зазначеними у
defaultsзначеннями.
Цей метод зручний для операцій, де важливо уникнути дублювання.
Типові помилки при створенні об'єктів
- Відсутність обов'язкових полів
Якщо ти забудеш вказати значення обов'язкового поля, Django викличе помилку IntegrityError.
Book.objects.create(
title="Книга без автора",
# author не вказаний!
publication_date="2023-10-12",
isbn="9781234567890",
price=100.00
)
# django.db.utils.IntegrityError: NOT NULL constraint failed: book.author
- Порушення унікальності
Ми вже бачили, що при порушенні унікальності поля, позначеного як unique=True, виникає помилка IntegrityError. Це особливо критично для e-commerce додатків, де унікальність товарів або користувачів надзвичайно важлива.
- Невірний тип даних для поля
Django автоматично перевіряє типи даних полів. Наприклад, якщо ти спробуєш задати строкове значення для поля DecimalField, отримаєш помилку.
Book.objects.create(
title="Книга з помилкою",
author="Автор",
publication_date="2023-10-12",
isbn="9781234567890",
price="Двісті гривень"
)
# ValueError: Field 'price' expected a number but got 'Двісті гривень'.
Приклади з реального життя
- Реєстрація користувача
Припустимо, ти створюєш систему аутентифікації. За допомогою методу create() можна додати нового користувача:
from django.contrib.auth.models import User
user = User.objects.create_user(
username="new_user",
email="new_user@example.com",
password="securepassword"
)
print(user)
# <User: new_user>
- Додавання товару в каталог
В інтернет-магазині ти можеш додати новий товар, встановивши його властивості:
from shop.models import Product
product = Product.objects.create(
name="Ноутбук",
category="Електроніка",
price=50000,
stock=10
)
Що далі?
На наступній лекції ми навчимося читати дані з бази за допомогою QuerySet. Це буде схоже на читання книг з полиці бібліотеки, де тобі дадуть і список усіх книг, і можливості сортування, фільтрації та вибірки найцікавіших екземплярів. Так, і ще додамо трохи SQL-магії без SQL!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ