Модель Django

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

В дальнейшем запись в базе данных является объектов одного из класса, а поля будут атрибутами объекта.
При этом все сложности по построению запросов в базу данных по добавлению, удалению, изменению записей Django берет на себя. Предоставляется API по работе с данными.
Описание моделей происходит в файле model.py приложения. Рассмотрим пример создания распространённых моделей объектов.

Модель объекта "Категория" - описывает принцип группировки нескольких элементов. Например группы пользователей или жанры статей.

Модель объекта "Статья" - содержит описание элемента. Например статья, пользователь
Модель "Категория"

class Group(models.Model):
    title = models.CharField(max_length=200,
                             verbose_name='Категория')
    slug = models.SlugField(max_length=255,
                            unique=True,
                            verbose_name='Параметр')
    description = models.TextField(verbose_name='Описание')

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = 'Категория'
        verbose_name_plural = 'Категории'
        ordering = ('category',)
описание полей
Модель содержит три поля:

  • Заголовок категории. Имеет максимальную длину 200 символов
  • Адрес страницы категории. Имеет максимальную длину 255 символов. Указывает, что поле должно быть уникальным
  • Описание категории
Типы полей в Django
Модель "Статья"

class Post(models.Model):
    text = models.TextField(verbose_name='Содержание')
    pub_date = models.DateTimeField(auto_now_add=True,
                                    verbose_name='Дата создания')
    group = models.ForeignKey('Group',
                              blank=True,
                              null=True,
                              on_delete=models.SET_NULL,
                              related_name='posts',
                              verbose_name='Категория')
    author = models.ForeignKey(User,
                               on_delete=models.CASCADE,
                               related_name='posts',
                               verbose_name='Автор')

    def __str__(self):
        return self.text.join(self.text.split(' ')[:20]) + " ->>"

    class Meta:
        verbose_name = 'Статья'
        verbose_name_plural = 'Статьи'
        ordering = ('-pub_date', 'author')
ОПИСАНИЕ полей
Модель содержит четыре поля:

  • Заголовок поста.
  • Дата создания поста. Заполняется автоматически при создании
  • Группа поста. Выбирается из модели Group. Может быть пустым. При удалении группы посты не теряются.
  • Автор поста. Выбирается из модели User. При удалении автора - все посты удаляются
Описание свойств поля ForeignKey
Связи моделей
Таблицы в реляционных баз данных связаны друг с другом. Django предлагает способы определения трех наиболее распространенных типов отношений базы данных:

ForeignKeyПоля принимают ряд дополнительных аргументов, которые объясняются в справочнике по полям модели . Эти параметры помогают определить, как должны работать отношения.

ManyToManyFieldПоля также принимают ряд дополнительных аргументов, которые объясняются в справочнике по полям модели .

OneToOneField поля также принимают необязательный parent_link аргумент
Наследование моделей
Наследование моделей в Django работает почти так же, как обычное наследование классов в Python, но все же следует следовать основам изложенным в документации к Django.

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

  1. Использование родительского класса для хранения информации, которая повторяется в дочерних моделях. Сам класс никогда не будет использоваться изолированно, поэтому вам нужны абстрактные базовые классы .
  2. Модель объединяет или расширяет несколько сущностей. Каждая модель имеет свою собственную таблицу базы данных, наследование нескольких таблиц.
  3. Изменение поведение модели на уровне Python, не изменяя поля модели каким-либо образом. Proxy models