В процессе работы с веб-приложением мы постоянно создаём или обновляем данные — будь то пользователь, статья блога или заказ в интернет-магазине. Сегодня мы узнаем, как создавать объекты с помощью 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!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ