JavaRush /Курсы /Модуль 3: Django /Введение в ORM и его преимущества

Введение в ORM и его преимущества

Модуль 3: Django
7 уровень , 0 лекция
Открыта

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

SELECT * FROM products WHERE price > 100;

Это работает, но через какое-то время у вас начинает рябить в глазах от SQL-кода. К тому же SQL-запросы нужно вручную адаптировать под разные базы данных (PostgreSQL, MySQL, SQLite и т.д.). А если вы вдруг ошиблись в запросе, база данных может вернуться с загадочным сообщением в духе "ERROR 1064", а вы останетесь в недоумении.

И тут на помощь приходит ORM! Object-Relational Mapping (Объектно-реляционное отображение) — это способ взаимодействия между вашим приложением и базой данных через код без необходимости писать SQL-запросы вручную.

Итак, почему ORM — это круто?

  1. Абстракция базы данных
    ORM позволяет работать с базой данных, как с обычными объектами Python. Вы описываете структуру ваших данных в виде классов, а ORM берет на себя все остальное: создание таблиц, выполнение запросов, внесение изменений и т.д.

  2. Код становится чище
    Вместо длинных SQL-запросов вы пишете компактные и удобные методы. Например, вместо SQL-запроса:

    SELECT * FROM products WHERE price > 100;
    

    Вы можете написать Python-код:

    Product.objects.filter(price__gt=100)
    
  3. Повышение продуктивности
    ORM берет на себя большую часть рутины, позволяя вам сконцентрироваться на бизнес-логике приложения, а не на низкоуровневых деталях взаимодействия с базой данных.

  4. Портируемость между базами данных
    С ORM ваш код становится независимым от конкретной базы данных. Хотите поменять SQLite на PostgreSQL? Без проблем! Просто измените настройки проекта, и Django ORM сделает остальное.

Django ORM: краткий обзор

Django поставляется с мощной встроенной системой ORM. Она позволяет вам:

  • Создавать таблицы базы данных с использованием Python-классов.
  • Выполнять CRUD-операции (создание, чтение, обновление и удаление данных) без написания SQL-запросов.
  • Работать с фильтрацией, сортировкой, агрегированием данных и многим другим.

Когда вы используете Django ORM, каждый класс, который вы определяете как модель, соответствует одной таблице в базе данных. Поля класса — это колонки таблицы. А экземпляры этого класса — это строки таблицы. Вот такая хитрая и удобная магия.

Вот, например, класс модели:

from django.db import models

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

Этот код создаст таблицу в базе данных, соответствующую модели Product, с колонками name, price и description.

Как работает ORM: объяснение на пальцах

В который раз представьте себе ресторан. У вас есть кухонный персонал (Django ORM), который готовит блюда (SQL-запросы), а вы — официант (разработчик), который просто подает заказы и общается с клиентами. Вам не нужно вникать, как шеф-повар готовит пасту карбонара — достаточно сказать, что вы хотите пасту. Аналогично с ORM: вы говорите, что хотите получить список продуктов дороже 100, а ORM сама разберется с SQL-запросом.

Пример использования Django ORM

  1. Создание объекта

    Создадим новый продукт:

    product = Product(name="Лампа", price=500.99, description="Настольная лампа с LED-подсветкой")
    product.save()
    

    Здесь мы создали объект Product и сохранили его в базе данных методом save().

  2. Чтение данных

    Извлечем все продукты из таблицы:

    products = Product.objects.all()
    

    Этот код вернет список всех объектов из таблицы Product.

  3. Фильтрация данных

    Извлечем только те продукты, цена которых больше 100:

    expensive_products = Product.objects.filter(price__gt=100)
    

    Этот метод возвращает отфильтрованный список объектов.

  4. Обновление записи

    Изменим цену у продукта:

    lamp = Product.objects.get(name="Лампа")
    lamp.price = 450.49
    lamp.save()
    
  5. Удаление записи

    Удалим продукт из базы:

    lamp = Product.objects.get(name="Лампа")
    lamp.delete()
    

Преимущества Django ORM: снова подытожим

  • Скорость и удобство: ORM позволяет работать с базами данных, используя привычный Python. Вам не нужно учить синтаксис SQL или переживать за корректность запросов.
  • Меньше ошибок: ORM генерирует оптимизированный SQL-код, который чаще всего не страдает от типичных ошибок ручного написания SQL.
  • Управление миграциями: ORM автоматически создает и применяет изменения в структуре базы данных, что упрощает разработку.

Краткий словарь терминов

Прежде чем мы продолжим наше путешествие по Django ORM, вот краткий список новых терминов, которые вы должны знать:

  • Модель (Model): класс в Python, который описывает структуру данных. Каждая модель соответствует одной таблице в базе данных.
  • Поле (Field): переменная внутри модели, которая описывает одну колонку таблицы.
  • Объект QuerySet: набор данных, который вы получаете, применяя запросы к модели (например, filter, all и т.д.).
  • Миграция: способ внесения изменений в структуру базы данных (таблицы, колонки и т.д.).

А что дальше?

Теперь, когда вы поняли, зачем нужен ORM и как он работает, мы перейдем к практике. В следующей лекции мы создадим первую модель в вашем Django-приложении. Затем добавим в нее поля, настроим атрибуты и научимся управлять этой моделью через ORM. Готовьтесь, будет много интересного!

1
Задача
Модуль 3: Django, 7 уровень, 0 лекция
Недоступна
Создание объектов и фильтрация данных
Создание объектов и фильтрация данных
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Ivan Уровень 59
17 июля 2025
Валидатор в этой задаче опять косячит. Написал необходимый код - валидатор всё пометил зелёным кроме пункта создания миграции (что правильно) Сделал миграции - все пункты покраснели. Удалил миграции и базу данных - опять всё зелёное кроме миграций Повторил три раза, в какой-то момент валидатор задачу таки принял.
Евгений Уровень 82
19 августа 2025
В задаче в структуре приложения `products` изначально отсутствует папка migrations, поэтому миграции не пройдут (не создастся таблица Product). Соответственно и скрипт не отработает - нет таблицы для добавления данных. Сравнивая свое решение с правильным, обратил внимание, что в решении отсутствует база данных. Удаляем базу данных и валидатор засчитывает решение. Даже миграции не нужно делать. Но это неправильный подход. Так не должно быть. Пересоздал проект с нуля - удалил проект (product_management), приложение (products) ну и manage.py, оставив скрипт с решением (populate_products.py), requirements.txt ну и venv. Создал проект и приложение заново. Зарегистрировал приложение. Создал модель. Провел миграции. Заглянул в базу данных - создалась таблица Product. Запустил скрипт - таблица наполнилась данными. Удалил venv. Отправил на проверку - не пропустило. Удалил базу данных - валидатор засчитал задачу.
Марат Уровень 57
18 ноября 2025
Мне еще пришлось и папку scripts создавать чтобы решение прошло.