Python · API · Початковий рівень

Query-параметри

6 завдань

Фільтруйте, шукайте, сортуйте та пагінуйте результати API за допомогою query-параметрів.

Фільтрація та сортування через params={}

#
Параметри запиту — це пари ключ-значення, що додаються до URL після знаку питання: ``` https://apilearn.tukas.dev/api/products/?category=kitchen&ordering=price ``` Вони дозволяють серверу зрозуміти, що ви хочете: яку категорію, яку сторінку, як сортувати. Можна будувати такий рядок вручну, але бібліотека requests пропонує зручніший спосіб: передайте dict як аргумент params, і вона сама вирішить кодування: ```python import requests BASE_URL = 'https://apilearn.tukas.dev' params = { 'category': 'kitchen', 'ordering': 'price', } response = requests.get(f'{BASE_URL}/api/products/', params=params) print(response.url) # показує повний URL, що був надісланий ``` response.url корисний для налагодження — він показує точний URL, що побудувала бібліотека, включаючи всі закодовані параметри. Ендпоінт /api/products/ приймає такі параметри: - category — фільтр за slug категорії (наприклад, 'kitchen', 'bedroom') - ordering — поле сортування; префікс - для спадного порядку (наприклад, 'price', '-price', 'name') - search — повнотекстовий пошук у назвах та описах продуктів - min_price / max_price — фільтр за діапазоном ціни - has_discount — встановіть 'true', щоб повернути лише продукти зі знижкою - page / page_size — пагінація (розглядається в темі Pagination) Параметри можна вільно комбінувати. Сервер застосовує всі фільтри разом, тому можна запросити товари для спальні до $200, відсортовані за назвою, одним запитом.

Фільтрація, сортування та пошук — паттерни

#
Фільтр за однією категорією: ```python response = requests.get(f'{BASE_URL}/api/products/', params={'category': 'office'}) data = response.json() print(data['count']) # продукти лише в категорії office ``` Фільтр за діапазоном ціни: ```python params = {'min_price': 50, 'max_price': 150} response = requests.get(f'{BASE_URL}/api/products/', params=params) for product in response.json()['results']: print(product['name'], product['sell_price']) ``` Сортування за ціною спадно (найдорожчі першими): ```python params = {'ordering': '-price', 'page_size': 5} response = requests.get(f'{BASE_URL}/api/products/', params=params) for p in response.json()['results']: print(p['name'], p['price']) ``` Пошук за ключовим словом: ```python params = {'search': 'chair'} response = requests.get(f'{BASE_URL}/api/products/', params=params) print(response.json()['count'], 'продуктів знайдено') ``` Комбінація кількох фільтрів в одному запиті: ```python params = { 'category': 'bedroom', 'max_price': 300, 'has_discount': 'true', 'ordering': 'name', } response = requests.get(f'{BASE_URL}/api/products/', params=params) data = response.json() print(f'{data["count"]} знижених товарів для спальні до $300') ``` Зверніть увагу: has_discount приймає рядок 'true', а не булеве значення Python True. Параметри запиту в HTTP — завжди рядки; requests конвертує прості значення, але з булевоподібними прапорами найкраще бути явними.

Довідник query-параметрів

#
Параметри запиту для GET /api/products/: ``` category string Slug категорії: kitchen, bedroom, living-room, office, hardware, decor, bathroom, kids-room, outdoor, dining-room, storage, lighting ordering string Поле сортування. Префікс - для спадного порядку: price, -price, name, -name search string Повнотекстовий пошук у назві та описі min_price number Мінімальна ціна (включно) max_price number Максимальна ціна (включно) has_discount string 'true' — повернути лише продукти зі знижкою page int Номер сторінки (за замовчуванням: 1) page_size int Елементів на сторінці (за замовчуванням: 20) ``` Усі параметри необов'язкові та можуть комбінуватися. Відповідь завжди містить count, next, previous і results. Швидкі приклади: ```python # 5 найдешевших товарів у категорії kitchen params = {'category': 'kitchen', 'ordering': 'price', 'page_size': 5} # Усі товари зі знижкою params = {'has_discount': 'true'} # Продукти за запитом 'table' від $50 до $300 params = {'search': 'table', 'min_price': 50, 'max_price': 300} ```
01

Фільтр за категорією

#

Отримайте всі продукти в категорії "bedroom" та виведіть їх загальну кількість.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# Отримайте товари категорії bedroom і виведіть загальну кількість
Рішення
import requests

BASE_URL = 'https://apilearn.tukas.dev'

params = {'category': 'bedroom'}
response = requests.get(f'{BASE_URL}/api/products/', params=params)
data = response.json()
print(data['count'])
02

Фільтр за діапазоном ціни

#

Отримайте продукти з ціною від $50 до $100 та виведіть назву і sell_price кожного продукту на першій сторінці.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# Отримайте продукти від $50 до $100
Рішення
import requests

BASE_URL = 'https://apilearn.tukas.dev'

params = {'min_price': 50, 'max_price': 100}
response = requests.get(f'{BASE_URL}/api/products/', params=params)
for product in response.json()['results']:
    print(product['name'], product['sell_price'])
03

Сортування результатів

#

Отримайте 5 найдорожчих продуктів у всьому каталозі та виведіть їхні назви і ціни.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# Отримайте 5 найдорожчих продуктів
Рішення
import requests

BASE_URL = 'https://apilearn.tukas.dev'

params = {'ordering': '-price', 'page_size': 5}
response = requests.get(f'{BASE_URL}/api/products/', params=params)
for product in response.json()['results']:
    print(product['name'], product['price'])
04

Пошук за ключовим словом

#

Знайдіть усі продукти, що містять слово "table", та виведіть кількість знайдених результатів.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# Знайдіть 'table' і виведіть кількість результатів
Рішення
import requests

BASE_URL = 'https://apilearn.tukas.dev'

params = {'search': 'table'}
response = requests.get(f'{BASE_URL}/api/products/', params=params)
print(response.json()['count'])
05

Комбінація кількох фільтрів

#

Отримайте знижені продукти в категорії "dining-room" з ціною до $400, відсортовані за назвою в алфавітному порядку. Виведіть назву і sell_price кожного результату.

import requests

BASE_URL = 'https://apilearn.tukas.dev'

# Комбінуйте category, max_price, has_discount і ordering
Рішення
import requests

BASE_URL = 'https://apilearn.tukas.dev'

params = {
    'category': 'dining-room',
    'max_price': 400,
    'has_discount': 'true',
    'ordering': 'name',
}
response = requests.get(f'{BASE_URL}/api/products/', params=params)
for product in response.json()['results']:
    print(product['name'], product['sell_price'])
06

Перевірте побудований URL

#

Побудуйте запит з category="office", ordering="-price", page_size=3. Перед тим як зчитати відповідь, виведіть повний URL, який requests побудував (включно з усіма параметрами запиту).

import requests

BASE_URL = 'https://apilearn.tukas.dev'

params = {
    'category': 'office',
    'ordering': '-price',
    'page_size': 3,
}
response = requests.get(f'{BASE_URL}/api/products/', params=params)

# Виведіть повний URL, який було надіслано
Рішення
import requests

BASE_URL = 'https://apilearn.tukas.dev'

params = {
    'category': 'office',
    'ordering': '-price',
    'page_size': 3,
}
response = requests.get(f'{BASE_URL}/api/products/', params=params)
print(response.url)
print(response.json()['count'], 'всього результатів')