В чем заключается принцип работы Django ORM?

«В чем заключается принцип работы Django ORM?» — вопрос из категории Django, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Django ORM (Object-Relational Mapper) — это слой абстракции, который позволяет взаимодействовать с базой данных, используя Python-код вместо написания SQL-запросов. Он сопоставляет Python-классы (модели) с таблицами в базе данных.

Ключевые компоненты:

  • Модели (models.Model): Python-классы, описывающие структуру таблиц в БД. Атрибуты класса соответствуют столбцам таблицы.
  • QuerySet: Объект, представляющий собой набор записей из базы данных. QuerySet'ы являются "ленивыми" (lazy) — реальный SQL-запрос выполняется только в момент обращения к данным (например, при итерации или вызове list()).
  • Менеджер (objects): Интерфейс для выполнения запросов к таблице (Model.objects.all(), Model.objects.filter(...)).
  • Миграции: Система для отслеживания изменений в моделях и автоматического обновления схемы базы данных (makemigrations, migrate).

Пример работы:

from django.db import models

# 1. Определение модели
class Product(models.Model):
    name = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    is_available = models.BooleanField(default=True)

# 2. Создание объекта (генерирует INSERT SQL)
# Product.objects.create(name="Laptop", price=1200.00)

# 3. Получение данных (генерирует SELECT ... WHERE ...)
cheap_products = Product.objects.filter(price__lt=500)

# 4. Обновление данных (генерирует UPDATE ... WHERE ...)
Product.objects.filter(name="Laptop").update(is_available=False)

Преимущества:

  • Продуктивность: Разработчик оперирует объектами Python, что быстрее и интуитивнее.
  • Безопасность: Встроенная защита от SQL-инъекций.
  • Переносимость: Код остается неизменным при смене СУБД (PostgreSQL, MySQL, SQLite).
  • Оптимизация: Инструменты select_related (для JOIN) и prefetch_related (для отдельных запросов) позволяют сократить количество обращений к БД.