JavaRush /Курсы /Модуль 3: Django /Чтение данных с помощью QuerySet

Чтение данных с помощью QuerySet

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

QuerySet — это своего рода "картотека" объектов, которую предоставляет Django ORM. Это набор данных, извлечённых из базы, который можно использовать для различных операций: чтения, фильтрации, сортировки и так далее. QuerySet позволяет работать с данными в Python, скрывая от нас нюансы SQL-запросов (хотя потихоньку мы начнем их разглядывать).

Допустим, у нас есть модель Book с книгами. Мы можем извлечь все книги из базы данных с помощью магической строки:

# Пример получения всех объектов
all_books = Book.objects.all()

Этот метод возвращает QuerySet, содержащий все записи таблицы Book. Не путайте QuerySet с полноценным Python-списком! QuerySet ленивый — мы поговорим об этом чуть позже.

Основные операции с QuerySet

Получение всех записей с .all()

Метод .all() является начальной точкой для работы с QuerySet. Он позволяет загрузить все записи из базы данных, соответствующие текущей модели.

# Извлечем все книги
books = Book.objects.all()

# Выведем названия книг
for book in books:
    print(book.title)

Обратите внимание, что QuerySet, возвращаемый .all(), по сути, представляет собой "ссылку" на SQL-запрос, а не сразу выполняет его.

Работать с большими объемами данных

Если в таблице тысячи (или даже миллионы) записей, то выполнение all() может стать проблемой, так как все данные загружаются в память. Никому не нравится, когда сервер падает от нехватки оперативной памяти! Именно здесь вступают в игру фильтрация, ограничение выборки и пагинация, о которых мы поговорим на других лекциях.

Для начала: старайтесь избегать неоптимальных запросов типа Model.objects.all() в продакшене. Мы просто изучаем основы!

Итерация по QuerySet

Для работы с данными из QuerySet мы используем итерацию. Это похоже на работу с Python-списками, но под капотом Django хитро выполняет SQL-запросы.

# Пример итерации по QuerySet
books = Book.objects.all()

for book in books:
    print(f"Название книги: {book.title}, Автор: {book.author}")

Каждый элемент book в этой итерации — это объект модели Book. Вы можете обращаться к его атрибутам (полям), как к обычным свойствам объекта Python.

Фильтрация: предварительная подготовка данных

Хотя метод .all() полезен, в реальной жизни мы редко хотим получить абсолютно все записи из базы. Обычно нас интересуют только некоторые из них. Например, все книги, написанные конкретным автором, или книги с ограниченным количеством страниц.

Для этого мы будем использовать ключевые методы фильтрации, такие как filter() и exclude(), которые будут подробно рассмотрены в следующей лекции.

Особенности работы с большими объемами данных

QuerySet поддерживает ленивую загрузку: это значит, что данные из базы не извлекаются, пока в этом нет необходимости.

Например, в следующем коде SQL-запрос к базе данных не выполняется, пока мы не начнем итерироваться по books:

books = Book.objects.all()  # Запрос еще не выполнен

# Вот здесь запрос выполняется
for book in books:
    print(book.title)

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

Реальные примеры работы с QuerySet

Пример 1: вывод списка книг

Допустим, у нас есть следующая модель:

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.CharField(max_length=255)
    published_date = models.DateField()
    pages = models.IntegerField()

Мы можем извлечь все книги и вывести их:

# Извлечем все записи
books = Book.objects.all()

# Выведем информацию о каждой книге
for book in books:
    print(f"Название: {book.title}, Автор: {book.author}, Год издания: {book.published_date}")

Если в базе 100 объектов Book, то будет выполнен SQL-запрос, который извлечёт все 100 строк.

Пример 2: ленивая загрузка

QuerySet позволяет довольно эффективно управлять памятью. Например:

books = Book.objects.all()  # Запрос еще НЕ выполнен
print("QuerySet создан.")

# Запрос выполняется только здесь
for book in books:
    print(book.title)

Попробуйте запустить этот код в вашем проекте и убедитесь, что запрос к базе данных выполняется не в момент создания QuerySet, а при первой необходимости, например, при вызове for.

Пример 3: побольше практики!

Создайте новый Django-проект и модель Book, как описано выше. Добавьте несколько записей в базу, используя Book.objects.create() (или админку Django). Затем выполните следующие действия:

  1. Извлеките все книги из базы.
  2. Выведите на экран названия всех книг.
  3. Оцените, как работает QuerySet, используя ленивую загрузку.

Ошибки при работе с QuerySet

На начальном этапе вы можете столкнуться с несколькими типичными проблемами. Например, некоторые пытаются преобразовать QuerySet в список с использованием list() и затем работают с этим списком. Хоть это и возможно, в большинстве случаев этого не нужно делать. Сохранение ленивой загрузки часто более эффективно.

Другая ошибка — предполагать, что QuerySet "статичен". Например, вызвав .all(), вы получаете "снимок" данных на текущий момент, но если данные в базе изменятся, QuerySet не обновится волшебным образом.

Домашнее задание

  1. Создайте Django-проект и модель Book, как описано в примерах выше.
  2. Добавьте несколько записей в базу данных (минимум 5).
  3. Напишите скрипт, который выводит все названия книг в консоль. Убедитесь, что SQL-запрос выполняется только один раз (используйте инструменты отладки, такие как Django Debug Toolbar).

Теперь, когда вы научились извлекать и манипулировать большими объемами данных с помощью QuerySet, впереди нас ждёт увлекательный мир фильтрации! Работать с данными станет еще интереснее.

1
Задача
Модуль 3: Django, 8 уровень, 2 лекция
Недоступна
Получение всех объектов из модели
Получение всех объектов из модели
1
Задача
Модуль 3: Django, 8 уровень, 2 лекция
Недоступна
Извлечение объектов и итерация
Извлечение объектов и итерация
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ