JavaRush /Курсы /Модуль 3: Django /Создание первой модели

Создание первой модели

Модуль 3: Django
7 уровень , 1 лекция
Открыта

Прежде чем углубляться в код, давайте разберемся, зачем вообще нужны модели. Модель в Django — это своего рода мост между вашей базой данных и Python-кодом. Она описывает структуру данных, хранящихся в базе, и предоставляет способы взаимодействия с этими данными. Под капотом Django ORM (Object-Relational Mapping) превращает ваши модели в SQL-запросы, тем самым избавляя вас от необходимости писать тонны SQL вручную. Удобно? Безусловно.

Можно сказать, что модель — это чертеж или шаблон таблицы в базе данных, где задается структура (поля и их типы) и логика работы с данными. Каждый экземпляр модели представляет одну строчку в таблице, а сами поля модели соответствуют колонкам таблицы.

Структура класса модели в Django

Модель в Django создаётся как класс, который наследуется от базового класса models.Model. Вот основная структура:

from django.db import models

class MyModel(models.Model):
    # ваши поля здесь
    pass

Звучит слишком просто? Да так и есть. Вы просто описываете поля модели, и Django сам позаботится о создании таблицы под капотом. Но давайте разберем это более детально.

Пишем первую модель: шаг за шагом

Создадим простую модель для нашего проекта. Допустим, мы делаем приложение для библиотеки (пусть это будет наша стартовая тема). Нам нужна модель для хранения информации о книгах.

Шаг 1: Открываем файл models.py

Файл models.py для каждого приложения (app) используется для описания моделей. Откройте его, и вы увидите, что он уже содержит строку импорта models.

Шаг 2: Создаём модель Book

В этом файле определим модель под названием Book. Она будет содержать три поля: название книги, автора и дату публикации.

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)  # Название книги
    author = models.CharField(max_length=100)  # Имя автора
    published_date = models.DateField()  # Дата публикации

Разберем код по частям:

  • title: поле типа CharField, которое используется для текстовых данных небольшой длины. Атрибут max_length указывает максимальное количество символо.
  • author: ещё одно CharField для имени автора. Здесь также важно указать max_length.
  • published_date: поле типа DateField, которое используется для хранения даты. Отличный выбор, если ваша база данных будет анализировать даты.

Если не указать max_length в CharField, Django посмотрит на вас так же осуждающе, как кот, которого разбудили среди ночи.

Корреляция: модель и база данных

Когда мы создаем модель, Django автоматически использует ее для формирования схемы базы данных. Например, приведённая выше модель Book превратится в SQL-запрос примерно такого вида:

CREATE TABLE library_book (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    title VARCHAR(200) NOT NULL,
    author VARCHAR(100) NOT NULL,
    published_date DATE NOT NULL
);

Обратите внимание, что поле id не было явным образом указано в нашей модели. Django автоматически добавляет это поле как первичный ключ для каждой модели.

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

Допустим, теперь нам нужно добавить модель пользователя для нашей библиотеки. Каждому пользователю нужно указывать имя, электронную почту и дату регистрации. Вот как это будет выглядеть:

class User(models.Model):
    name = models.CharField(max_length=100)  # Имя пользователя
    email = models.EmailField(unique=True)  # Уникальный email
    registration_date = models.DateTimeField(auto_now_add=True)  # Дата регистрации
  • EmailField: поле, специально разработанное для проверки формата адреса электронной почты.
  • unique=True: гарантирует, что два пользователя не смогут зарегистрироваться с одинаковым email.
  • auto_now_add: для DateTimeField это означает, что значение будет автоматически установлено на текущую дату и время при создании объекта.
Примечание:

auto_now_add подходит для неизменяемых дат (например, даты регистрации). Если вам нужно динамически обновлять дату (например, дату последнего обновления), используйте auto_now.

Что дальше?

Теперь, когда модели созданы, вам нужно сообщить Django, чтобы он добавил их в базу данных. Для этого используются миграции.

  1. Создать миграцию (файл, описывающий изменения в структуре базы данных):

    python manage.py makemigrations
    

    Django создаст файл миграции, который представляет ваши изменения.

  2. Применить миграцию (внести изменения в базу данных):

    python manage.py migrate
    

    Теперь таблицы для ваших моделей будут созданы.

Проверяем результат

После создания и применения миграций можно убедиться, что таблицы были созданы корректно. Есть два способа это сделать:

Способ 1: Использование Django shell

Откройте Django shell:

python manage.py shell

Попробуйте создать объект Book:

from library.models import Book

# Создаем экземпляр книги
book = Book(title="Гарри Поттер", author="Дж. К. Роулинг", published_date="1997-06-26")
book.save()  # Сохраняем в базе

# Проверяем сохранение
print(Book.objects.all())

Вывод должен показать, что объект был успешно добавлен.

Способ 2: Проверка базы данных напрямую

Подключитесь к вашей базе данных (например, SQLite) и выполните запрос:

SELECT * FROM library_book;

Вы увидите строку с данными вашей книги.

Какие ошибки могут возникнуть?

  1. "table does not exist": если вы забыли выполнить миграции, Django будет ругаться, что таблица не существует. Всегда запускайте migrate.
  2. Ошибка уникальности: поля с unique=True должны содержать уникальные значения. Если вы попытаетесь создать запись с дублирующимся значением, получите ошибку.
  3. "NOT NULL constraint failed": поля без атрибута null=True требуют обязательного значения.

Для чего это нужно в реальной жизни?

Создание моделей позволяет вам централизованно управлять всеми аспектами структуры базы данных. Если однажды вы решите добавить новое поле или изменить логику работы с данными, вам достаточно будет внести изменения в модель. Django позаботится об остальном. Это полезно не только для разработки, но и для поддерживаемости кода. Например:

  • При разработке интернет-магазина модели помогут описать товары, заказы, пользователей.
  • В блоге модели представляют посты, комментарии, теги.
  • А в нашей библиотеке — книги, авторов и читателей.

Определение моделей — это отправная точка для всего приложения.

1
Задача
Модуль 3: Django, 7 уровень, 1 лекция
Недоступна
Создание модели с дополнительными настройками
Создание модели с дополнительными настройками
1
Задача
Модуль 3: Django, 7 уровень, 1 лекция
Недоступна
Создание сложной модели
Создание сложной модели
Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Артём Васенин Уровень 93
9 августа 2025
А меня всегда удивляет когда сначала надо решить в задаче что-то чего не объясняли а потом может быть в курсе об этом расскажут. Практика в чтении мыслей... Например: Добавьте уникальное ограничение на сочетание полей `name` и `artist`, чтобы невозможно было создать два альбома с одинаковыми именами от одного исполнителя.
Ivan Уровень 59
17 июля 2025
Ещё одна глючная задача. В IDE плагин не принимал без объяснения причин - просто показывал красным "Задача не прошла валидацию". Переключился на сайт, ничего не менял. Зачли с первого раза.