Ответ
В Django ORM существует три типа наследования моделей, каждый из которых решает свою задачу:
-
Абстрактные базовые классы (Abstract Base Classes)
Используются для вынесения общих полей в родительскую модель, которая сама по себе не будет создавать таблицу в БД. Это основной способ следовать принципу DRY (Don't Repeat Yourself).
- Когда применять: Когда у вас есть несколько моделей с одинаковым набором полей.
- Как использовать: Добавить
abstract = True
вMeta
класс.
class TimeStampedModel(models.Model): created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: abstract = True class MyModel(TimeStampedModel): name = models.CharField(max_length=100)
-
Многотабличное наследование (Multi-table Inheritance)
Каждая модель в иерархии получает свою собственную таблицу в БД. Django автоматически создает
OneToOneField
для связи дочерней модели с родительской. Это приводит кJOIN
-операциям при доступе к полям родителя.- Когда применять: Если у вас есть подтипы существующей модели, и вы хотите работать с ними полиморфно.
- Как использовать: Просто наследуйтесь от другой конкретной (не абстрактной) модели.
class Place(models.Model): name = models.CharField(max_length=50) address = models.CharField(max_length=80) class Restaurant(Place): serves_hot_dogs = models.BooleanField(default=False)
-
Прокси-модели (Proxy Models)
Используются для изменения Python-поведения модели (например, добавления новых методов или изменения менеджера по умолчанию) без изменения полей и таблицы в БД.
- Когда применять: Когда нужно изменить поведение модели на уровне Python (сортировка, кастомные менеджеры), не затрагивая схему БД.
- Как использовать: Добавить
proxy = True
вMeta
класс.
class Person(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) class OrderedPerson(Person): class Meta: proxy = True ordering = ["last_name"]