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, попереду нас чекає захопливий світ фільтрації! Працювати з даними стане ще цікавіше.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ