Атрибут abstract

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

Синтаксис

pythonfrom django.db import models

class BaseModel(models.Model):
  created_at = models.DateTimeField(auto_now_add=True)
  updated_at = models.DateTimeField(auto_now=True)

  class Meta:
    abstract = True

Пример

Объявим абстрактную модель с общими полями и унаследуем от неё две конкретные модели:

pythonfrom django.db import models

# Абстрактная модель-основа
class TimestampMixin(models.Model):
  created_at = models.DateTimeField(auto_now_add=True)
  updated_at = models.DateTimeField(auto_now=True)

  class Meta:
    abstract = True

# Конкретные модели
class Article(TimestampMixin):
  title = models.CharField(max_length=100)
  content = models.TextField()

class Comment(TimestampMixin):
  article = models.ForeignKey(Article, on_delete=models.CASCADE)
  text = models.CharField(max_length=255)

При выполнении миграций для модели Article будут созданы поля created_at и updated_at, но отдельной таблицы для TimestampMixin не существует. Убедимся в этом, проверив атрибуты экземпляра:

pythonfrom myapp.models import Article

article = Article(title="About abstract", content="Content text")
article.save()

print(article.created_at)
print(article.updated_at)

Результат выполнения кода:

python"2026-09-05 12:00:00+00:00"
"2026-09-05 12:00:00+00:00"

Пример

Абстрактная модель может содержать не только поля, но и методы. Например, добавим метод для форматированного вывода даты:

pythonfrom django.db import models

class BaseModel(models.Model):
  created_at = models.DateTimeField(auto_now_add=True)

  class Meta:
    abstract = True

  def get_created_date(self):
    return self.created_at.date()

class Post(BaseModel):
  title = models.CharField(max_length=100)
  body = models.TextField()

Теперь у модели Post доступен метод get_created_date, унаследованный от абстрактной модели:

pythonfrom myapp.models import Post

post = Post(title="First post", body="Hello, world!")
post.save()

res = post.get_created_date()
print(res)

Результат выполнения кода:

python"2026-09-05"

Смотрите также

  • атрибут db_table,
    который задаёт имя таблицы в базе данных для модели
  • атрибут ordering,
    который определяет сортировку записей по умолчанию
  • атрибут verbose_name,
    который задаёт читаемое имя модели в единственном числе
  • атрибут verbose_name_plural,
    который задаёт читаемое имя модели во множественном числе