Ответ
Абстрактная модель в Django — это базовый класс модели, который не создает собственную таблицу в базе данных, а служит шаблоном для других моделей.
Основная цель — вынести общие поля и методы в один родительский класс, чтобы избежать дублирования кода (принцип DRY — Don't Repeat Yourself).
Ключевые особенности:
- Для объявления модели как абстрактной используется
abstract = Trueво вложенном классеMeta. - Наследующие модели получают все поля и методы родительской абстрактной модели.
- Это удобный способ для добавления полей аудита (например,
created_at,updated_at) или общей логики во множество моделей.
Пример:
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):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
В этом примере модели Article и Author автоматически получат поля created_at и updated_at, но в базе данных будет создана только таблица для Article и Author, а не для TimeStampedModel.
Ответ 18+ 🔞
Так, слушай, вот есть у тебя в Джанго эти ваши модели, да? И вот представь — ты пишешь кучу моделей, и в каждой из них одно и то же говно повторяется. Ну, например, created_at и updated_at. И ты каждый раз это копируешь, как последний лох, блядь. А потом бац — надо поменять логику. И ты начинаешь бегать по всем файлам, как угорелый, и править одно и то же в десяти местах. Пиздец, да?
Вот чтобы такого не было, умные люди придумали абстрактные модели. Это, по сути, такой шаблон, заготовка. Ты в неё засовываешь всё общее — поля, методы, что угодно. А потом от неё нахуяриваешь кучу нормальных моделей, которые это всё наследуют.
Главные фишки, чтобы не облажаться:
- Чтобы модель стала абстрактной, ты внутри неё пишешь класс
Metaи ставишь тамabstract = True. Это как сказать Джанго: «Слушай, дружище, не создавай для меня отдельную таблицу в базе, я тут просто для красоты и порядка». - Все, кто от неё унаследуют, получат её поля и методы автоматом, как по волшебству. Это и есть тот самый принцип DRY (Don't Repeat Yourself), или, как я его называю, «Не повторяйся, а то заебешься».
- Идеально подходит для всяких служебных полей вроде дат создания-обновления, или если у тебя в каждой модели должно быть поле
is_active. Один раз описал — и овердохуища моделей его подхватили.
Смотри, как это выглядит на практике:
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):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
И что получается? И Article, и Author — они теперь с полями created_at и updated_at. Но в базе данных, ёпта, появятся только таблицы article и author. Для TimeStampedModel таблицы нет — она как призрак, как идея. Красота же, в рот меня чих-пых! Один раз написал — и всюду размножил. Умно, блядь.