22. Модели в Django.
Для абстрагирования при работе с данными в Django используется понятие слоя моделей (model layer).
Django ORM
- Для взаимодействия с базой в Django принято использовать встроенный ORM (Object-Relational Mapper, механизм объектно-ориентированного отображения).
- Описание объектное представление данных задаётся с помощью моделей (models).
- Модель отображается на отдельную таблицу в базе данных.
- Фреймворк представляет автоматически генерируемое API для работы с данными и генерации операций при работе с базой.
- Django ORM имеет встроенный механизм миграций.
Модели
- Модель - класс наследник django.db.models.Model.
- Атрибут модели - поле в базе данных.
- По этим данным Django ORM автоматически генерирует API для работы с базой.
- При работе с моделями нужно использовать миграции и не забывать их генерировать\применять при изменении моделей.
Атрибуты моделей
- Поля класса описывающего модель.
- Наследники django.db.models.Field.
- С помощью их определяется:
- тип данных в базе
- HTML виджет, который будет использован при рендеринге формы
- базовые примитивные правила валидации
- Есть много уже готовых классов (примеры):
- IntegerField
- BooleanField
- CharField
- DateField
- DurationField
- ImageField
- и т.д.
- Специальный атрибут objects, создаётся для каждой модели автоматически и является интерфейсом через который происходит взаимодействие с базой.
Параметры аттрибутов
- Есть как свои для отдельных типов полей, так и общие.
- Некоторые общие аргументы (опциональны):
- null - если True, то NULL для пустых значений в базе.
- blank - если True, то поле может быть пустым (с точки зрения валидации, а не данных в базе).
- choices - iterable и пар (значение_в_базе, человекочитаемый_текст).
- default - значение по-умолчанию для поля.
- help_text - текст, будет отображен в виджете формы (также удобно просто для документации).
- unique - значение должно быть уникальным (среди всех таких полей в таблице).
- primary_key - если True, то текущее поле станет primary ключом в таблице.
Если в таблице модели нет атрибутов с параметром primary_key, то отдельное поле будет создано автоматически.
id = models.AutoField(primary_key=True)