Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Django: ORM, database table, model mapping, abstract model, inheritance

У каждой модели есть таблица в базе?

Проверяет понимание того, как ORM сопоставляет модели с таблицами базы данных, и знание исключений, таких как наследование и абстрактные модели.

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

Не обязательно. В большинстве ORM (например, Django ORM, SQLAlchemy) каждая модель по умолчанию соответствует одной таблице. Однако существуют исключения: абстрактные модели не создают таблиц, а при наследовании может использоваться одна таблица для нескольких моделей (например, объединенное табличное наследование). Также модели могут быть связаны с представлениями или вообще не иметь таблицы, если они используются только для валидации.

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

Связь модели и таблицы в ORM

В объектно-реляционном отображении (ORM) модель обычно представляет собой класс, который сопоставляется с таблицей в базе данных. По умолчанию каждая модель создает отдельную таблицу, где поля модели становятся столбцами, а экземпляры — строками. Однако это правило не является абсолютным.

Исключения

  • Абстрактные модели: Не создают таблиц. Используются как базовые классы для общих полей. Например, в Django:
    class BaseModel(models.Model):
        created_at = models.DateTimeField(auto_now_add=True)
        class Meta:
            abstract = True
    
    class Product(BaseModel):
        name = models.CharField(max_length=100)
    Здесь BaseModel не имеет таблицы, а Product создает таблицу с полями name и created_at.
  • Наследование: В некоторых ORM (например, SQLAlchemy) можно использовать объединенное табличное наследование, где несколько моделей хранятся в одной таблице с дискриминатором. Или наоборот, каждая модель в своей таблице с внешним ключом.
  • Представления (views): Модель может быть привязана к представлению базы данных, а не к таблице. Это полезно для отчетов.
  • Модели без таблиц: В некоторых фреймворках модели могут использоваться только для валидации данных без сохранения в БД (например, формы в Django).

Практический пример

Рассмотрим SQLAlchemy с наследованием:

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

Base = declarative_base()

class Employee(Base):
    __tablename__ = 'employee'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    type = Column(String)
    __mapper_args__ = {'polymorphic_on': type}

class Manager(Employee):
    __tablename__ = 'manager'
    id = Column(Integer, ForeignKey('employee.id'), primary_key=True)
    department = Column(String)
    __mapper_args__ = {'polymorphic_identity': 'manager'}

Здесь Employee и Manager используют две таблицы, но связаны через внешний ключ. Это не одна таблица на модель, а гибридный подход.

Вывод

Понимание того, что модель не всегда равна таблице, важно для проектирования эффективной схемы БД, особенно при наследовании или использовании абстракций. Это позволяет избежать избыточности и улучшить производительность.

  • Аватар

    Python Guru

    Sergey Filichkin

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Django

    Django

  • SQL

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

#ORM

#database table

#model mapping

#abstract model

#inheritance

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

  • Аватар

    Python Guru

    Sergey Filichkin

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