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) используют похожие подходы.

1
Задача
Модуль 3: Django, 7 уровень, 6 лекция
Недоступна
Создание объекта модели
Создание объекта модели
1
Задача
Модуль 3: Django, 7 уровень, 6 лекция
Недоступна
Работа с несколькими объектами
Работа с несколькими объектами
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ