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!

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