Что такое абстрактная базовая модель в Django и для чего она используется?

Ответ

Абстрактная базовая модель в Django — это класс модели, который служит шаблоном для других моделей, но сам по себе не создаёт таблицу в базе данных. Его основная цель — следовать принципу DRY (Don't Repeat Yourself), вынося общие поля и методы в один переиспользуемый класс.

Чтобы сделать модель абстрактной, нужно установить abstract = True в её внутреннем классе Meta.

Когда это полезно?

Чаще всего абстрактные модели используют для добавления полей аудита, таких как дата создания и обновления, во все или многие модели проекта.

Пример:

from django.db import models

# Абстрактная модель с общими полями
class TimeStampedModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="Дата создания")
    updated_at = models.DateTimeField(auto_now=True, verbose_name="Дата обновления")

    class Meta:
        # Эта строка делает модель абстрактной
        abstract = True

# Конкретные модели, которые наследуют общие поля
class Article(TimeStampedModel):
    title = models.CharField(max_length=200)
    content = models.TextField()

class Author(TimeStampedModel):
    name = models.CharField(max_length=100)

Ключевые характеристики:

  • Не создаёт таблицу в БД: Для TimeStampedModel не будет создано отдельной таблицы.
  • Поля добавляются к наследникам: В результате миграции таблица для Article будет содержать поля id, created_at, updated_at, title, content. Аналогично для Author.
  • Упрощает поддержку: Изменение общей логики в одном месте (в абстрактной модели) автоматически применяется ко всем моделям-наследникам.