JavaRush /Курси /Модуль 3: Django /Додавання даних в базу через модель

Додавання даних в базу через модель

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

Отже, у нас вже є моделі, описані в коді. Але як перетворити ці визначення на реальні рядки в базі даних? 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)

Якщо ви бачите свої записи в консолі, значить, все працює коректно.

Можливі помилки та як їх уникнути

При додаванні даних через моделі можна зіткнутися з декількома типовими помилками:

  1. Помилка унікальності (IntegrityError): якщо ви намагаєтесь додати запис із вже існуючим значенням у поле isbn (яке є унікальним), Django викине IntegrityError. Рішення просте: перед додаванням даних переконайтесь, що значення унікальних полів не перетинаються.

  2. Пропуск обов'язкових полів: якщо ви не вказуєте значення для поля без null=True або default, Django кине виняток. Щоб цього уникнути, завжди вказуйте значення для обов'язкових полів.

  3. Некоректні значення: наприклад, якщо ви вкажете текст замість числа для pages, станеться помилка. Завжди слідкуйте за тим, щоб типи даних відповідали вимогам полів.

Практичне завдання

Крок 1: створіть кілька записів

  1. Використовуючи метод .create(), додайте 5 книг у базу даних.
  2. Використовуйте Django shell для виконання завдання.

Крок 2: перевірте дані

  1. Отримайте список усіх книг за допомогою .all() і виведіть їх у консолі.
  2. Напишіть невеликий цикл, який виведе автора кожної книги.

Крок 3: використовуйте bulk_create

  1. Напишіть скрипт, який додасть 3 книги за один запит, використовуючи bulk_create.

Навіщо це потрібно?

"Чому ORM краще, ніж просто SQL?" — це питання можна часто почути на співбесідах. Вміння працювати з ORM демонструє ваш професіоналізм і розуміння високорівневих абстракцій. У реальному житті додавання даних у базу — це повсякденне завдання, будь то заповнення нової таблиці чи робота з даними користувачів. Використання Django ORM спрощує процес і зменшує ймовірність помилок.

Крім того, вміння працювати з ORM — це навичка, яка знадобиться вам за межами Django, адже багато популярних фреймворків (наприклад, FastAPI з SQLAlchemy) використовують схожі підходи.

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