Создание моделей и миграции базы данных - Python с нуля до Junior: Путь к первой работе в IT - Qpel.AI

Создание моделей и миграции базы данных

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

Что такое модели Django?

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

Django-модели используют мощный ORM (Object-Relational Mapper). Это значит, что вам не нужно писать SQL-запросы вручную. Вы работаете с обычными Python-объектами, а Django сам переводит ваши действия в SQL-запросы. Это упрощает разработку и делает код понятнее.

Давайте создадим простую модель Post для нашего блога:

# blog/models.py

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    published_date = models.DateTimeField(auto_now_add=True)
    author = models.CharField(max_length=100)

    def __str__(self):
        return self.title

Мы определили модель Post с четырьмя полями:

  • title: Заголовок поста. Тип CharField (строка с ограничением длины).
  • content: Содержимое поста. Тип TextField (большой текстовый блок).
  • published_date: Дата публикации. Тип DateTimeField. auto_now_add=True автоматически ставит текущую дату и время при создании поста.
  • author: Автор поста. Тип CharField.

Метод __str__(self) нужен, чтобы объекты модели удобно отображались, например, в админ-панели Django. Он возвращает строковое представление объекта.

Важно: Создали или изменили модели? Всегда запускайте миграции.

Что такое миграции базы данных?

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

Процесс миграции состоит из двух шагов:

  1. Создание миграций (makemigrations): Django анализирует изменения в моделях и генерирует Python-файлы с описанием этих изменений.
  2. Применение миграций (migrate): Django выполняет инструкции из файлов миграций, применяя их к базе данных.

Шаг 1: Создаём миграции

Откройте терминал в корневой директории вашего Django-проекта (там, где лежит manage.py). Выполните команду:

python manage.py makemigrations blog

Здесь blog — это название вашего приложения. Если не укажете имя, Django попробует создать миграции для всех приложений в проекте.

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

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

Это значит, что Django создал файл миграции 0001_initial.py в папке blog/migrations/. Он содержит инструкции для создания таблицы Post в базе данных.

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

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

python manage.py migrate

Django применит все неприменённые миграции. Вы увидите список применённых миграций, включая вашу новую миграцию для модели Post.

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, blog
Running migrations:
  Applying blog.0001_initial... OK

Поздравляю! 🎉 Теперь в вашей базе данных есть таблица, которая соответствует вашей модели Post.

Совет: Всегда сначала запускайте makemigrations, а потом migrate. Если забудете makemigrations, migrate не увидит изменений.

Изменение моделей и повторные миграции

Что, если вы захотите добавить новое поле в модель Post? Например, поле для количества просмотров.

# blog/models.py

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    published_date = models.DateTimeField(auto_now_add=True)
    author = models.CharField(max_length=100)
    views_count = models.IntegerField(default=0) # Новое поле

    def __str__(self):
        return self.title

После добавления поля views_count снова выполните те же две команды:

  1. python manage.py makemigrations blog
  2. python manage.py migrate

Django сгенерирует новый файл миграции (например, 0002_add_views_count_to_post.py). Он будет содержать инструкции по добавлению нового столбца views_count в существующую таблицу Post. Затем migrate применит эти изменения.

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

  1. В вашем Django-проекте откройте файл models.py в одном из приложений (например, blog).
  2. Создайте новую модель Comment (Комментарий) с такими полями:
    • text (текст комментария): TextField
    • author (автор комментария): CharField с max_length=100
    • created_date (дата создания): DateTimeField с auto_now_add=True
  3. Добавьте метод __str__(self), который будет возвращать первые 50 символов текста комментария.
  4. Выполните команды python manage.py makemigrations <ваше_приложение> и python manage.py migrate, чтобы применить изменения к базе данных.
  5. (Необязательно, но полезно для проверки) Запустите python manage.py shell и попробуйте создать несколько объектов Comment и Post программно. Убедитесь, что всё работает.

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

Далее мы научимся связывать наши модели с веб-интерфейсом: настроим URL-маршрутизацию и поработаем с шаблонами, чтобы пользователи могли взаимодействовать с вашими данными.