Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΡ€Π·ΠΈΠ½ΡƒΠŸΠΎΠ·Π²ΠΎΠ½ΠΈΡ‚ΡŒ
Найти Π² Π”Π·Π΅Π½Π΅
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста

πŸŽΈπŸ—„οΈ Как ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ запросов ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Django

НСоптимизированныС запросы ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ ΠΈΠ· Π‘Π” Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ. Π§Ρ‚ΠΎΠ±Ρ‹ этого ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ defer(), only() ΠΈ exclude(). Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊ ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Π΅Π±-прилоТСния для агСнтства нСдвиТимости. Π‘Ρ‚Π°Ρ‚ΡŒΡ основана Π½Π° ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Β«Django Query Optimization – Defer, Only, and ExcludeΒ». ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ‡Π°Ρ‰Π΅ всСго Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΈΠ·-Π·Π° Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…: Ρ‡Π΅ΠΌ большС Π΄Π°Π½Π½Ρ‹Ρ… Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ, Ρ‚Π΅ΠΌ дольшС выполняСтся запрос, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‚Π΅ΠΌ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ вся систСма. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Π² Django, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ defer(), only() ΠΈ exclude(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ объСм ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ разбСрСмся, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚, Π½ΠΎ сначала обсудим особСнности ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ сдСлаСм тСст исходной ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ прилоТСния. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΡ‹ возьмСм Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для агСнтства нСдвиТимости. Π’ Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ: Property (Π½Π΅Π΄Π²ΠΈΠΆΠΈΠΌΠΎΡΡ‚ΡŒ) ΠΈ Location (мСстополоТСн
ОглавлСниС

НСоптимизированныС запросы ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ ΠΈΠ· Π‘Π” Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ. Π§Ρ‚ΠΎΠ±Ρ‹ этого ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ defer(), only() ΠΈ exclude(). Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊ ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Π΅Π±-прилоТСния для агСнтства нСдвиТимости.

Π‘Ρ‚Π°Ρ‚ΡŒΡ основана Π½Π° ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Β«Django Query Optimization – Defer, Only, and ExcludeΒ».

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ‡Π°Ρ‰Π΅ всСго Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΈΠ·-Π·Π° Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…: Ρ‡Π΅ΠΌ большС Π΄Π°Π½Π½Ρ‹Ρ… Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ, Ρ‚Π΅ΠΌ дольшС выполняСтся запрос, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‚Π΅ΠΌ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ вся систСма.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Π² Django, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ defer(), only() ΠΈ exclude(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ объСм ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ разбСрСмся, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚, Π½ΠΎ сначала обсудим особСнности ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ сдСлаСм тСст исходной ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ прилоТСния.

Настройки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΡ‹ возьмСм Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для агСнтства нСдвиТимости. Π’ Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ: Property (Π½Π΅Π΄Π²ΠΈΠΆΠΈΠΌΠΎΡΡ‚ΡŒ) ΠΈ Location (мСстополоТСниС).

Π€Π°ΠΉΠ» models.py:

Оба ΠΌΠΎΠ΄Π΅Π»ΠΈ содСрТат нСсколько ΠΏΠΎΠ»Π΅ΠΉ ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ to_json(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сСриализуСт всС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Python. Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ API-эндпоинты:

  • / β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ список всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² нСдвиТимости.
  • / / β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅.
  • / /amenities/ β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список удобств (бассСйн, Π±Π°Π»ΠΊΠΎΠ½ ΠΈ Ρ‚.ΠΏ.) для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

ВСст ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π²Π΅Π±-прилоТСния, Π²Π°ΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ, насколько быстро ΠΎΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ состоянии. Для этого ΠΌΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Django Silk β€” инструмСнтом для измСрСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния HTTP-запросов ΠΈ запросов ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ….

ЗапуститС сСрвСр ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ HTTP-запросы ΠΊ API Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· curl:

  • http://127.0.0.1:8000/
  • http://127.0.0.1:8000/1/
  • http://127.0.0.1:8000/1/amenities/

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ Π½Π° страницС Silk β€” http://127.0.0.1:8000/silk/requests/.

Π’ нашСм случаС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ выглядят Ρ‚Π°ΠΊ:

  • Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ списка ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² / Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 765 мс, ΠΈΠ· Π½ΠΈΡ… 301 мс тратится Π½Π° запросы ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ….
  • Π’Ρ‹Π΄Π°Ρ‡Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ дСталям /1/ ΠΈ удобствам /1/amenities/ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° выполняСтся Π·Π° 11 мс (ΠΈΠ· Π½ΠΈΡ… ~1 мс Π½Π° Π±Π°Π·Ρƒ).

Если ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ SQL-запросы, Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ всС Ρ‚Ρ€ΠΈ эндпоинта Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ всС поля ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Property, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² Π²Ρ‹Π²ΠΎΠ΄Π΅.

SQL-запрос для списка ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² /:

SQL-запрос для Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ /1/:

SQL-запрос для удобств /1/amenities/:

Π§Ρ‚ΠΎ здСсь ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ:

  • Бписок ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² / Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ всС поля, хотя Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСбольшой ΠΈΡ… Π½Π°Π±ΠΎΡ€.
  • Запрос Π½Π° удобства /1/amenities/ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ всю ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, хотя сам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡƒΠΆΠ΅ извСстСн.
  • Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ запрос /1/ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ всС поля, Π΄Π°ΠΆΠ΅ Ссли Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ запросов, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ:

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ only() ΠΈΠ»ΠΈ defer(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½Ρ‹Π΅ поля.
  • ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ select_related() ΠΈ prefetch_related() для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ JOIN-запросов.
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π½ΡƒΠΆΠ½Ρ‹ Π»ΠΈ всС Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

Π”Π°Π»Π΅Π΅ ΠΌΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ, ΠΊΠ°ΠΊ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ эти ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

🐍🎸 ΠšΡƒΡ€Ρ Django. Π§Π°ΡΡ‚ΡŒ 2: ORM ΠΈ основы Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

ΠœΠ΅Ρ‚ΠΎΠ΄ defer() Π² Django

ΠœΠ΅Ρ‚ΠΎΠ΄ defer() позволяСт ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ поля ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ запроса ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ всС поля ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ запрос, загруТая Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ defer()

Когда ΠΌΡ‹ выполняСм запрос ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Django ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ всС поля ΠΌΠΎΠ΄Π΅Π»ΠΈ:

Если ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ defer(), Django ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ поля ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ:

Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ список ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² нСдвиТимости, Π½ΠΎ ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ описаниС description, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ тСкст.

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ запрос Π±Π΅Π· defer()

Π­Ρ‚ΠΎΡ‚ запрос Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ всС поля, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ description, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΌΠ΅Π΄Π»ΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅:

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ запрос с defer():

Если Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ тСст ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ использованиС defer("description") ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΠΎ врСмя выполнСния запроса с 765 мс Π΄ΠΎ 184 мс, Ρ‚.Π΅. Π² 4 Ρ€Π°Π·Π°!

Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ defer():

  • Для тСкстовых TextField ΠΈ JSON-ΠΏΠΎΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π°Π½Π½Ρ‹Ρ….
  • Если ΠΏΠΎΠ»Π΅ Ρ€Π΅Π΄ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π° Π΅Π³ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° замСдляСт запрос.
  • ΠŸΡ€ΠΈ создании списков ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΠ³Π΄Π° Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ всС Π΄Π΅Ρ‚Π°Π»ΠΈ.

ΠœΠ΅Ρ‚ΠΎΠ΄ only() Π² Django

ΠœΠ΅Ρ‚ΠΎΠ΄ only() β€” это ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° defer(). ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ поля, ΠΎΠ½ позволяСт явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ поля Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ only() ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСбольшой Π½Π°Π±ΠΎΡ€ ΠΏΠΎΠ»Π΅ΠΉ, Π° Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла.

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ only()

ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ SQL-запрос Π±Π΅Π· only() Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ всС ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹:

А с only() Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ:

Π­Ρ‚ΠΎ позволяСт ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ объСм Π΄Π°Π½Π½Ρ‹Ρ…, Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… ΠΈΠ· Π±Π°Π·Ρ‹, ΠΈ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ запроса.

Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ список ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² нСдвиТимости, Π½ΠΎ для Π²Ρ‹Π²ΠΎΠ΄Π° Π² спискС Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ID, Π½Π°Π·Π²Π°Π½ΠΈΠ΅ name, мСсторасполоТСниС location ΠΈ Ρ†Π΅Π½Π° price.

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ запрос Π±Π΅Π· only()

Π­Ρ‚ΠΎΡ‚ запрос Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ всС поля ΠΌΠΎΠ΄Π΅Π»ΠΈ Property, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹:

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ запрос с only():

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Django Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ поля. ВСст ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ врСмя выполнСния запроса ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΠΎΡΡŒ с 184 мс Π΄ΠΎ 154 мс, Π½Π° 30 мс быстрСС ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с defer().

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности only():

  • МоТно Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ поля ΠΈΠ· связанных ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ. Если Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π³ΠΎΡ€ΠΎΠ΄ city ΠΈΠ· ΠΌΠΎΠ΄Π΅Π»ΠΈ Location, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ only(), Π° ΠΊΠΎΠ³Π΄Π° defer()

Π›ΡƒΡ‡ΡˆΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ запроса ΠΈ структуры ΠΌΠΎΠ΄Π΅Π»ΠΈ:

  • only() ΠΏΠΎΠ»Π΅Π·Π΅Π½, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСсколько ΠΏΠΎΠ»Π΅ΠΉ.
  • defer() Π»ΡƒΡ‡ΡˆΠ΅, Ссли ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ поля ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ.

🐍 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста

Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста»

πŸπŸŽ“ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python для собСса

ΠŸΠΎΠ΄Ρ‚ΡΠ½ΡƒΡ‚ΡŒ свои знания ΠΏΠΎ Python Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python для собСса»

🐍🧩 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Python

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ Python для ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ PythonΒ»

ΠœΠ΅Ρ‚ΠΎΠ΄ exclude() Π² Django

ΠœΠ΅Ρ‚ΠΎΠ΄ exclude() β€” это ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° filter(). Если filter() Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ условиям, Ρ‚ΠΎ exclude() ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΈΡ… ΠΈΠ· Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ.

Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ defer() ΠΈ only() Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΠΎΠ»Π΅ΠΉ (столбцов), Π° exclude() примСняСтся Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ строк, ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Ρ‹Π²Π°Ρ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ записи.

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ exclude()

Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ модСль нСдвиТимости Property, ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°Ρ‚ΡŒ всС ΠΊΠ²Π°Ρ€Ρ‚ΠΈΡ€Ρ‹:

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ выполняСт SQL-запрос:

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ exclude() для Π²Ρ‹Π±ΠΎΡ€Π° всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ НЕ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠ²Π°Ρ€Ρ‚ΠΈΡ€Π°ΠΌΠΈ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ этот SQL-запрос, ΠΈ Π² Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠ²Π°Ρ€Ρ‚ΠΈΡ€:

ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ условий с exclude()

Как ΠΈ filter(), exclude() ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ с нСсколькими условиями. Допустим, Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ всС здания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅:

  • НС ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π·Π΅ΠΌΠ΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ участками.
  • Π˜ΠΌΠ΅ΡŽΡ‚ ΠΏΠ»ΠΎΡ‰Π°Π΄ΡŒ Π±ΠΎΠ»Π΅Π΅ 1000 ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Ρ… Ρ„ΡƒΡ‚ΠΎΠ².

SQL-запрос Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠΌ:

Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ exclude():

  • Когда Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ записи ΠΈΠ· Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ.
  • Когда ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ лишниС записи, Ρ‡Π΅ΠΌ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ filter().
  • ΠŸΡ€ΠΈ слоТных Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡΡ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ всС, ΠΊΡ€ΠΎΠΌΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΉ).

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

πŸπŸš€ Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Ρ€Π΅ΠΊΡ€ΡƒΡ‚ΠΈΠ½Π³ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚Π°Π» Π½Π° Django: Ρ‡Π°ΡΡ‚ΡŒ 1

ΠŸΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ defer() ΠΈ only() Π² Django

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ defer() ΠΈ only() ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ запросы, Π½ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ ΠΈΡ… использованиС ΠΌΠΎΠΆΠ΅Ρ‚ сильно ΡƒΡ…ΡƒΠ΄ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

Главная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: хотя defer() ΠΈ only() ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ поля ΠΈΠ· ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ SQL-запроса, Django Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ доступ ΠΊ этим полям Π² дальнСйшСм. Если ΠΏΠΎΠ·ΠΆΠ΅ Π² ΠΊΠΎΠ΄Π΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ полям, Django создаст Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ SQL-запросы, ΠΈ Π² ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ Ссли Π±Ρ‹ всС Π΄Π°Π½Π½Ρ‹Π΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ»ΠΈΡΡŒ сразу.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ошибки с only()

Π’ прСдставлСнии property_amenities_view() сначала Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½Ρ‹Π΅ поля:

SQL-запрос выглядит Ρ‚Π°ΠΊ:

Π—Π΄Π΅ΡΡŒ всС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ: Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ½Ρ‹Π΅ поля, Π½ΠΈΡ‡Π΅Π³ΠΎ лишнСго. Но Ссли ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½ΠΎΠ²Ρ‹Π΅ поля, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, спальни bedrooms ΠΈ Π²Π°Π½Π½Ρ‹Π΅ bathrooms, Django сдСлаСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ SQL-запросы для ΠΈΡ… Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ SQL-запросы Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π°ΠΊΠΈΠΌΠΈ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас выполняСтся Ρ‚Ρ€ΠΈ запроса вмСсто ΠΎΠ΄Π½ΠΎΠ³ΠΎ, ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΡƒΡ…ΡƒΠ΄ΡˆΠΈΠ»Π°ΡΡŒ.

Как ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этой ошибки:

  • ΠŸΡ€ΠΈ использовании only() Π·Π°Ρ€Π°Π½Π΅Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΠΉΡ‚Π΅, ΠΊΠ°ΠΊΠΈΠ΅ поля понадобятся.
  • Если Π΅ΡΡ‚ΡŒ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊ полю ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΠ·ΠΆΠ΅ β€” Π»ΡƒΡ‡ΡˆΠ΅ сразу Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² запрос.
  • Π‘Π»Π΅Π΄ΠΈΡ‚Π΅ Π·Π° SQL-запросами Π² Django Silk ΠΈΠ»ΠΈ Django Debug Toolbar, ΠΎΠ½ΠΈ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ воврСмя Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ запросы.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ django_assert_num_queries Π² тСстах β€” это ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ автоматичСски ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ появлСниС Π½ΠΎΠ²Ρ‹Ρ… SQL-запросов.

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

πŸš€ Π£ΡΠΊΠΎΡ€ΡŒΡ‚Π΅ свою Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…: 7 ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ

ПодвСдСм ΠΈΡ‚ΠΎΠ³ΠΈ

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ запросы Π² Django, Π½ΡƒΠΆΠ½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ объСм Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ ΠΈΠ· Π±Π°Π·Ρ‹. Π­Ρ‚ΠΎ касаСтся ΠΈ строк (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΠΎΠ΄Π΅Π»ΠΈ), ΠΈ столбцов (Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΌΠΎΠ΄Π΅Π»ΠΈ):

  • Для ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ defer() ΠΈ only().
  • Для ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ exclude().

Π’Π°ΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° SQL-запросами (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Django Silk ΠΈΠ»ΠΈ Django Debug Toolbar) ΠΈ Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ошибок, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΡŽ ΠΈΡ… количСства.