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

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

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

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

Цели лекции

  1. Научиться создавать Django-модели.
  2. Понять, как модели связаны с базой данных через ORM.
  3. Изучить процесс миграций — как они помогают сохранять и вносить изменения в структуру базы данных.
  4. Сделать практический пример: создадим модель "Автор" для нашего блога.

Понятие модели в Django: что это вообще такое?

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

Модель в Django — это Python-класс, который наследуется от django.db.models.Model. Каждое свойство (атрибут) класса представляет собой столбец в таблице базы данных, а объект модели — это строка (запись) в этой таблице.

Пример: если бы таблица в базе данных была домиком, то модель в Django — это чертеж этого домика. ORM (Object-Relational Mapping) берет этот чертеж и создает реальный домик — таблицу в базе.

Как создать модель в Django

Чтобы создать модель, выполните следующие шаги:

  1. Откройте файл models.py вашего приложения. В нашем случае это blog/models.py.
  2. Определите Python-класс, который будет наследоваться от django.db.models.Model.
  3. Добавьте свойства класса, представляющие поля модели.

Давайте создадим простую модель для описания автора блога. Каждый автор будет иметь имя, фамилию, email и его дату регистрации.

from django.db import models

class Author(models.Model):
    # Поле для имени автора
    first_name = models.CharField(max_length=50)

    # Поле для фамилии автора
    last_name = models.CharField(max_length=50)

    # Поле для email
    email = models.EmailField(unique=True)

    # Поле для даты регистрации
    date_registered = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        # Этот метод используется для представления объекта в строковом формате
        return f"{self.first_name} {self.last_name}"

Разберем структуру кода

  • models.CharField(max_length=50): Поле для хранения текстовых данных. Аргумент max_length указывает максимальную длину строки.
  • models.EmailField(unique=True): Это специальное поле для хранения email-адресов. Аргумент unique=True означает, что email должен быть уникальным.
  • models.DateTimeField(auto_now_add=True): Поле для хранения даты и времени. auto_now_add=True автоматически заполняет поле текущей датой и временем при создании объекта.
  • Метод __str__: Возвращает строковое представление объекта модели. Это помогает, например, в админ-панели Django, чтобы объекты отображались в удобном виде.

Что такое миграции и зачем они нужны?

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

Как связаны миграции и базы данных?

  1. Модель: это Python-код, который вы пишете.
  2. Миграция: это промежуточный файл, который генерирует Django, чтобы преобразовать модель в инструкции для базы данных.
  3. База данных: после выполнения миграции изменения сохраняются в самой базе.

Основные команды для работы с миграциями

  1. Генерация миграций После создания или изменения модели в models.py, нужно сгенерировать файл миграции с помощью команды:
python manage.py makemigrations

Django создаст файл миграции, в котором будет описано, какую таблицу нужно добавить в базу данных. Например:

Migrations for 'blog':
  blog/migrations/0001_initial.py
    - Create model Author
  1. Применение миграций

Чтобы изменения вступили в силу и таблицы действительно появились в базе данных, нужно выполнить команду:

python manage.py migrate

Эта команда применяет все созданные миграции к базе данных.

Практика: создаем модель и выполняем миграции

Пора поработать руками и добавить модель "Автор" в наше приложение!

Шаг 1: Определяем модель в models.py Мы уже это сделали. Наш код для модели "Автор" готов.

Шаг 2: Генерируем файл миграции

Откройте терминал, перейдите в папку проекта и выполните команду:

python manage.py makemigrations

Вы увидите примерно следующее:

Migrations for 'blog':
  blog/migrations/0001_initial.py
    - Create model Author

Шаг 3: Применяем миграцию

Теперь создадим таблицу в базе данных. Выполните команду:

python manage.py migrate

Если всё прошло успешно, Django настроит базу данных и создаст таблицу для модели "Автор". Лёгким движением кода мы добавили новую сущность в базу! Магия.

Что делать, если модель нужно изменить?

Иногда вам потребуется изменить модель — например, добавить новое поле или изменить тип данных. Вот как это сделать:

  1. Внесите изменения в models.py.
  2. Снова выполните команду python manage.py makemigrations.
  3. Примените миграции командой python manage.py migrate.

Пример: добавим поле "биография" для автора.

Внесите изменения в модель:

class Author(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.EmailField(unique=True)
    date_registered = models.DateTimeField(auto_now_add=True)
    bio = models.TextField(blank=True, null=True)  # Поле для биографии

    def __str__(self):
        return f"{self.first_name} {self.last_name}"

Сгенерируйте и выполните миграции:

python manage.py makemigrations
python manage.py migrate

Теперь модель "Автор" обновлена, а база данных знает о новом поле.

Возможные ошибки и их решение

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

  • Ошибка Table already exists: это происходит, если таблица уже существует в базе данных. Убедитесь, что вы не дублируете существующие модели.
  • Ошибка Field requires a default value: если вы добавляете новое поле в модель, Django может попросить указать значение по умолчанию. Вы можете использовать default или добавить null=True.
  • Забыли сделать миграции: иногда легко забыть про команду makemigrations. Если изменения в модели не применились, проверьте, создавали ли вы для них миграцию.

Практическое задание

  1. В вашем проекте создайте модель "Категория" для блога. У каждой категории должно быть название и описание.
  2. Сгенерируйте и примените миграцию для модели "Категория".
  3. Убедитесь, что таблица создана в базе данных. Вы можете использовать Django Admin для проверки.
class Category(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()

    def __str__(self):
        return self.name

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

1
Задача
Модуль 3: Django, 6 уровень, 8 лекция
Недоступна
Добавление модели с ForeignKey
Добавление модели с ForeignKey
1
Задача
Модуль 3: Django, 6 уровень, 8 лекция
Недоступна
Связь между моделями и работа с миграциями
Связь между моделями и работа с миграциями
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Евгений Уровень 82
17 августа 2025
По второй задаче (Связь между моделями и работа с миграциями): 1. В settings.py отсутствует настройка TEMPLATES. Из-за этого не проходит команда makemigrations. Выдает ошибку:
 (admin.E403) A 'django.template.backends.django.DjangoTemplates' instance must be configured in TEMPLATES in order to use the admin application.
Решение: взять из предыдущей задачи настройку TEMPLATES 2. Валидатор в PyCharm не пропускает правильное решение задачи, пока не удалить базу данных SQLite.