Назад к вопросам
Middle
81
questionbank

Как происходит наследование моделей в Django?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

В Django наследование моделей происходит через обычные классы Python, которые наследуются от django.db.models.Model или от других моделей Django. Существуют три основных типа наследования:

  1. Абстрактные базовые классы: Определяют общие поля, которые будут унаследованы дочерними моделями, но сами не создают отдельную таблицу в базе данных.

    # 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
    
  2. Множественное наследование (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
    
  3. Наследование прокси-моделей (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
    

Выбор типа наследования зависит от задачи: абстрактные классы для общих полей без таблиц, множественное наследование для иерархий с отдельными таблицами, прокси-модели для изменения поведения без изменения базы данных.