Думаєте, ви добре знаєте моделі Django? Ці поради змінять ваше уявлення.

Django — це фантастичний фреймворк, який значно спрощує розробку веб-застосунків, але навіть досвідчені розробники можуть упустити деякі з його тонших можливостей. Одна з таких перлин — використання запитів defer() та only() для оптимізації викликів до бази даних і покращення продуктивності застосунку. Давайте розглянемо, як ці методи можуть змінити ваші проекти на Django.

Проблема з накладними витратами запитів

За замовчуванням, ORM Django завантажує всі поля моделі, коли ви виконуєте запит. Це часто є непотрібним, особливо коли ви працюєте з моделями, що мають численні поля або великі дані, як-от шляхи до файлів, описи чи JSON-поля.

Розглянемо цей приклад:

# Звичайний запит для отримання даних  
product = Product.objects.get(id=1)  

# Цей запит завантажує всі поля моделі Product, навіть якщо вам потрібне лише ім’я.  
print(product.name)

Це працює, але може призвести до суттєвих проблем з продуктивністю при роботі з великими наборами даних. І тут на допомогу приходять defer() і only().

Потужність defer() та only()

1. Що таке defer()?

Метод defer() вказує Django завантажувати всі поля окрім тих, що вказані. Це корисно, коли вам потрібно більшість даних, але ви хочете виключити конкретні поля.

# Завантажити всі поля, окрім 'description'  
product = Product.objects.defer('description').get(id=1)

У цьому випадку поле description не буде завантажене спочатку. Якщо ви звернетеся до нього пізніше, Django виконає окремий запит для його отримання.

2. Що таке only()?

Метод only(), в свою чергу, обмежує запит завантажувати тільки вказані поля. Це зручно, коли вам потрібні лише одне або два поля.

# Завантажити тільки поля 'name' та 'price'  
product = Product.objects.only('name', 'price').get(id=1)

Тепер Django завантажить тільки поля name та price, ігноруючи решту. Якщо ви спробуєте звернутися до будь-якого іншого поля, Django виконає додатковий запит для його отримання.

Чому це важливо

Для досвідчених розробників, які працюють з великими наборами даних або високонавантаженими застосунками, оптимізація запитів є важливою. defer() і only() можуть:

  • Зменшити розмір запиту, покращуючи час відповіді.
  • Знизити використання пам'яті на сервері.
  • Мінімізувати непотрібні запити до бази даних, що особливо корисно при роботі з віддаленими базами даних.

Реальний приклад

Уявімо, що ви розробляєте електронну комерцію, і у вас є модель Product, яка виглядає так:

class Product(models.Model):  
 name = models.CharField(max_length=255)  
 price = models.DecimalField(max_digits=10, decimal_places=2)  
 description = models.TextField()  
 image = models.ImageField(upload_to='products/')

Сценарій 1: Оптимізація переглядів списку

Коли ви відображаєте список продуктів, ймовірно, вам не потрібні поля description чи image:

products = Product.objects.defer('description', 'image')

Це гарантує, що ваш запит залишатиметься легким, завантажуючи тільки потрібні для перегляду поля.

Сценарій 2: Вибіркове отримання даних

Якщо ви створюєте сторінку порівняння цін, вам потрібно лише поле name та price:

products = Product.objects.only('name', 'price')

Це дозволить уникнути завантаження непотрібних полів, значно зменшуючи накладні витрати.

Попередження

Хоча defer() та only() — це потужні інструменти, використовуйте їх обережно. Звернення до відкладеного поля пізніше призведе до додаткового запиту, що може звести нанівець переваги в продуктивності в деяких сценаріях. Завжди профілюйте ваш застосунок, щоб переконатися, що ви досягаєте бажаної оптимізації.

Бонусний трюк: Динамічний вибір полів

Ось бонусний трюк для досвідчених користувачів: динамічне застосування only() на основі вводу користувача або вимог API:

fields_to_fetch = ['name', 'price'] # Динамічно визначено  
products = Product.objects.only(*fields_to_fetch)

Цей підхід особливо корисний при створенні API, де потрібні поля змінюються залежно від запитів клієнта.

Висновок

Навіть досвідчені розробники Django можуть не помітити таких трюків, як defer() і only(), для оптимізації запитів.
Правильне використання цих методів може значно покращити продуктивність вашого застосунку, особливо коли ви працюєте з великими наборами даних або в середовищах з високим навантаженням.

Спробуйте застосувати це у вашому наступному проекті та поділіться, як це працює для вас!

Перекладено з: Think You Know Django Models? These Tips Will Change Your Mind

Leave a Reply

Your email address will not be published. Required fields are marked *