Теперь настала пора сделать так, чтобы вместо примитивного текстового сообщения на страницу выводились полноценные сообщения, выгруженные из настоящей базы данных. Первый шаг – объявить модель.
Модель – специальный класс, описывающий конкретную таблицу в подключенной базе данных. В частности, необходимо описать доступный набор полей. При этом отдельный экземпляр класса — это отдельная запись таблицы (например, определенное сообщение блога, объявление и т.п.), что позволяет редактировать запись или выводить ее пользователю. При описании модели нет необходимости использовать привязку к определенной базе данных.
Для объявления модели используется файл models.py соответствующего пакета приложения. Первоначально данный модуль пуст.
Объявим модель Bb (объявления), указав следующие поля:
- title – заголовок объявления. Поле обязательно к заполнению и имеет строковой тип (до 50 символов);
- content – текст объявления (тип memo);
- price – цена товара (вещественное число);
- published – дата добавления объявления (временная метка, по умолчанию – текущая дата, индексированное поле);
Если запущен отладочный сервер, его необходимо остановить. Далее необходимо открыть файл models.py приложения bboard и добавить следующий код:
From django.db import models Class Bd(models.Model): title = models.CharField(max_length=50) content = models.TextField(null=True, blank=True) price = models.FloatField(null=True, blank=True) published = models.DateTimeField(auto_now_add=True, db_index=True)
Объявленная модель должна представлять собой подкласс класса Model (модуль django.db.models). Конкретные поля модели объявляются как атрибуты класса, которым необходимо присвоить экземпляры классов (поля). Параметры полей необходимо указывать в конструкторах классов соответствующих полей при помощи именованных параметров.
В новой модели использовались следующие классы полей:
- CharField – стандартное строковое поле, максимальная длина ограничена (параметр max_length);
- TextField – текстовое поле без ограничения длины (memo-поле). Присвоение параметрам blank и null значения True укажет, что данное поле пользователь может не заполнять (по умолчанию все поля обязательны к заполнению);
- DateTimeField – поле предназначено для хранения временной метки. Параметр auto_now_add позволяет указать, что при создании записи в данное поле необходимо занести текущее время и дату. Параметр db_index инициирует создание индекса для данного поля (объявления можно будет сортировать по дате).
Обычно таблицы баз банных имеют в составе специальное ключевое поле, необходимое для хранения уникальных значений для однозначной идентификации текущей записи (ключей). Как правило, поле имеет целочисленный тип и является автоинкрементным. В этом случае СУБД автоматически добавляет уникальный идентификатор в момент создания новой записи. При создании моделей в Django поле такого типа можно не объявлять – оно будет создано автоматически.
После сохранения файла необходимо сгенерировать новую миграцию, которая позволит автоматически создать в базе данных все необходимые таблицы.
Стоит помнить, что по умолчанию параметры нового проекта в Django настроены на использование БД SQLite. База данных хранится в виде файла db.sqlite3 (находится в каталоге проекта), который создается автоматически при первом обращении.
Миграции
Миграция – программа, которая генерируется на основе созданных моделей и предназначена для внесения изменений в базу данных: таблицы, правила, индексы, поля, а также связи.
Для запуска миграции, основанной на модели Bd, необходимо переключится на командную строку, убедится, что открыт каталог проекта, а отладочный сервер остановлен. Далее необходимо использовать команду:
manage.py makemigrations bboard
Данная команда начинает генерирование миграций для всех моделей, добавленных пользователем в указанное приложение.
Для хранения миграций используется пакет migrations, который находится в пакете текущего приложения. Файл первой миграции автоматически получает название 0001_initial.py.
В процессе выполнения миграции генерируются команды SQL, которые и обеспечивают создание нужной структуры БД. Посмотреть SQL-код можно при помощи команды в таком формате:
manage.py sqlmigrate bboard 0001
Для применения созданной миграции служит команда:
manage.py migrate
Данная команда выполняет все миграции (всех приложений), которые ранее не выполнялись. Стоит учитывать, что многие стандартные приложения, идущие в составе Django, используют базу данных для хранения своих данных. При этом для создания всех таблиц также используется готовый набор миграций.