Атрибут abstract
Атрибут abstract указывается внутри класса Meta модели Django. Когда он установлен в True, модель становится абстрактной. Это означает, что для неё не создаётся отдельная таблица в базе данных. Вместо этого она служит базовым классом, поля и методы которого наследуются дочерними моделями. Это полезно для устранения дублирования кода при наличии общих полей (например, временных меток) в нескольких моделях.
Синтаксис
from 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
Пример
Объявим абстрактную модель с общими полями и унаследуем от неё две конкретные модели:
from 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 не существует. Убедимся в этом, проверив атрибуты экземпляра:
from myapp.models import Article
article = Article(title="About abstract", content="Content text")
article.save()
print(article.created_at)
print(article.updated_at)
Результат выполнения кода:
"2026-09-05 12:00:00+00:00"
"2026-09-05 12:00:00+00:00"
Пример
Абстрактная модель может содержать не только поля, но и методы. Например, добавим метод для форматированного вывода даты:
from 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, унаследованный от абстрактной модели:
from myapp.models import Post
post = Post(title="First post", body="Hello, world!")
post.save()
res = post.get_created_date()
print(res)
Результат выполнения кода:
"2026-09-05"
Смотрите также
-
атрибут
db_table,
который задаёт имя таблицы в базе данных для модели -
атрибут
ordering,
который определяет сортировку записей по умолчанию -
атрибут
verbose_name,
который задаёт читаемое имя модели в единственном числе -
атрибут
verbose_name_plural,
который задаёт читаемое имя модели во множественном числе