Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Django: Django, ORM, model inheritance, abstract base class, multi-table inheritance, proxy model

Как наследуются модели в Django?

Вопрос проверяет понимание механизма наследования моделей в Django ORM и его влияния на структуру базы данных.

Короткий ответ

Django поддерживает три типа наследования моделей: абстрактные базовые классы, мультитабличное наследование и прокси-модели. Абстрактные классы не создают отдельной таблицы, а поля копируются в дочерние модели. Мультитабличное наследование создает отдельную таблицу для каждой модели с автоматической связью через первичный ключ. Прокси-модели изменяют поведение Python без изменения схемы БД.

Длинный ответ

Типы наследования моделей в Django

Django ORM предоставляет три механизма наследования моделей, каждый из которых по-разному влияет на структуру базы данных и поведение объектов.

Абстрактные базовые классы

При использовании абстрактного базового класса Django не создает таблицу для родительской модели. Вместо этого поля родителя копируются в таблицы всех дочерних моделей. Это полезно для повторного использования полей и методов без дополнительных JOIN-запросов.

from django.db import models

class BaseProduct(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)

    class Meta:
        abstract = True

class Book(BaseProduct):
    author = models.CharField(max_length=100)

class Electronic(BaseProduct):
    warranty = models.IntegerField()

Мультитабличное наследование

Каждая модель в иерархии получает свою таблицу в базе данных. Родительская и дочерняя таблицы связываются через автоматически созданное поле OneToOneField. Это позволяет выполнять запросы к родительской модели и получать все дочерние объекты, но требует JOIN-операций.

class Vehicle(models.Model):
    brand = models.CharField(max_length=50)
    year = models.IntegerField()

class Car(Vehicle):
    doors = models.IntegerField()

# Создание объекта
car = Car.objects.create(brand='Toyota', year=2020, doors=4)
# Доступ к родительским полям
print(car.brand)  # Toyota

Прокси-модели

Прокси-модели не создают новых таблиц. Они изменяют поведение Python (например, добавляют методы или меняют сортировку) для существующей модели. Все прокси-модели работают с одной и той же таблицей базы данных.

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']

    def full_name(self):
        return f'{self.first_name} {self.last_name}'

Выбор типа наследования зависит от задачи: абстрактные классы подходят для повторения полей без лишних связей, мультитабличное наследование — для полиморфных запросов, а прокси-модели — для изменения поведения без изменения схемы.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Django

    Django

  • SQL

Ключевые слова

#Django

#ORM

#model inheritance

#abstract base class

#multi-table inheritance

#proxy model

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.