Как происходит наследование моделей в Django?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
В Django наследование моделей происходит через обычные классы Python, которые наследуются от django.db.models.Model или от других моделей Django. Существуют три основных типа наследования:
-
Абстрактные базовые классы: Определяют общие поля, которые будут унаследованы дочерними моделями, но сами не создают отдельную таблицу в базе данных.
# models.py from django.db import models class CommonInfo(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() class Meta: abstract = True # Ключевое свойство class Student(CommonInfo): study_subject = models.CharField(max_length=100) # Унаследованы поля name и age -
Множественное наследование (multi-table inheritance): Каждая модель в иерархии создает свою собственную таблицу в базе данных. Между дочерней моделью и ее родителем автоматически создается связь OneToOneField.
# models.py from django.db import models 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) serves_pizza = models.BooleanField(default=False) # Унаследованы поля name и address # Автоматический OneToOneField к модели Place -
Наследование прокси-моделей (proxy models): Используется для изменения поведения модели, не меняя ее базовую структуру или записи в базе данных. Полезно для добавления методов, менеджеров или изменения метаданных. Не создает новую таблицу.
# models.py from django.db import models class Person(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) class MyPerson(Person): # Наследование class Meta: proxy = True # Ключевое свойство ordering = ["last_name"] # Пример изменения метаданных def full_name(self): # Добавление нового метода return f"{self.first_name} {self.last_name}" # Использует ту же таблицу, что и Person
Выбор типа наследования зависит от задачи: абстрактные классы для общих полей без таблиц, множественное наследование для иерархий с отдельными таблицами, прокси-модели для изменения поведения без изменения базы данных.