JavaRush /Курси /Модуль 3: Django /Створення об'єктів через модель

Створення об'єктів через модель

Модуль 3: Django
Рівень 8 , Лекція 1
Відкрита

У процесі роботи з веб-додатком ми постійно створюємо або оновлюємо дані — чи то користувач, стаття блогу або замовлення в інтернет-магазині. Сьогодні ми дізнаємося, як створювати об'єкти за допомогою 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: Війна і мир>

Що відбувається?

  1. Ми передаємо параметри для всіх *обов'язкових полів моделі.*
  2. Django автоматично створює запис у базі і повертає екземпляр цього запису (об'єкт).
  3. Новий рядок вже додано в таблицю бази даних.

Швидко, зручно, як кава з автомата.

Спосіб 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() дозволяє:

  1. Знайти існуючий запис, якщо він вже є в базі.
  2. Створити новий запис, якщо такого немає.
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)

Як це працює?

  1. Django шукає запис за вказаними критеріями (isbn="9780451524935").
  2. Якщо запис знайдено, метод повертає його і встановлює created = False.
  3. Якщо запису немає, створюється новий із зазначеними у defaults значеннями.

Цей метод зручний для операцій, де важливо уникнути дублювання.

Типові помилки при створенні об'єктів

  1. Відсутність обов'язкових полів

Якщо ти забудеш вказати значення обов'язкового поля, 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
  1. Порушення унікальності

Ми вже бачили, що при порушенні унікальності поля, позначеного як unique=True, виникає помилка IntegrityError. Це особливо критично для e-commerce додатків, де унікальність товарів або користувачів надзвичайно важлива.

  1. Невірний тип даних для поля

Django автоматично перевіряє типи даних полів. Наприклад, якщо ти спробуєш задати строкове значення для поля DecimalField, отримаєш помилку.

Book.objects.create(
    title="Книга з помилкою",
    author="Автор",
    publication_date="2023-10-12",
    isbn="9781234567890",
    price="Двісті гривень"
)
# ValueError: Field 'price' expected a number but got 'Двісті гривень'.

Приклади з реального життя

  1. Реєстрація користувача

Припустимо, ти створюєш систему аутентифікації. За допомогою методу 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>
  1. Додавання товару в каталог

В інтернет-магазині ти можеш додати новий товар, встановивши його властивості:

from shop.models import Product

product = Product.objects.create(
    name="Ноутбук",
    category="Електроніка",
    price=50000,
    stock=10
)

Що далі?

На наступній лекції ми навчимося читати дані з бази за допомогою QuerySet. Це буде схоже на читання книг з полиці бібліотеки, де тобі дадуть і список усіх книг, і можливості сортування, фільтрації та вибірки найцікавіших екземплярів. Так, і ще додамо трохи SQL-магії без SQL!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ