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

Робота з категоріями

5 завдань

Отримайте та вивчіть категорії продуктів, потім використайте їх для фільтрації списку товарів.

Ендпоінт категорій

#
Ендпоінт категорій надає список усіх товарних груп каталогу. Є два способи його використовувати: Отримати всі категорії: ```python import requests BASE_URL = 'https://apilearn.tukas.dev' response = requests.get(f'{BASE_URL}/api/categories/') data = response.json() print(data['count']) # 13 print(data['results']) # список об'єктів категорій ``` Отримати одну категорію за slug: ```python response = requests.get(f'{BASE_URL}/api/categories/kitchen/') category = response.json() print(category['id']) # 7 print(category['name']) # 'Kitchen' print(category['slug']) # 'kitchen' ``` Кожен об'єкт категорії має три поля: id (ціле число), name (рядок для відображення) та slug (маленький рядок з дефісами, що використовується в URL і параметрах фільтра). Slug — це ключова сполучна ланка: саме це значення ви передаєте в параметр category= при фільтрації продуктів. Тому після отримання списку категорій можна відразу використовувати будь-який slug для запиту продуктів цієї категорії, нічого не жорсткокодуючи: ```python categories = requests.get(f'{BASE_URL}/api/categories/').json()['results'] for cat in categories: count = requests.get( f'{BASE_URL}/api/products/', params={'category': cat['slug']}, ).json()['count'] print(f"{cat['name']}: {count} продуктів") ``` Цей патерн — отримати список ідентифікаторів, а потім використовувати їх як параметри в інших запитах — є фундаментальним у роботі з REST API.

Практичні паттерни з категоріями

#
Побудуйте dict для перетворення slug на назву за списком категорій: ```python response = requests.get(f'{BASE_URL}/api/categories/') categories = response.json()['results'] slug_to_name = {cat['slug']: cat['name'] for cat in categories} print(slug_to_name) # {'kitchen': 'Kitchen', 'bedroom': 'Bedroom', ...} ``` Це зручно, коли у відповіді на продукт є slug, але потрібно вивести зрозумілу назву без додаткового запиту на кожен продукт. Знайдіть категорію з найбільшою кількістю продуктів: ```python response = requests.get(f'{BASE_URL}/api/categories/') categories = response.json()['results'] best = None best_count = 0 for cat in categories: count = requests.get( f'{BASE_URL}/api/products/', params={'category': cat['slug'], 'page_size': 1}, ).json()['count'] if count > best_count: best_count = count best = cat['name'] print(f'{best}: {best_count} продуктів') ``` Зверніть увагу на page_size=1 — вам потрібне лише поле count, а не самі продукти. Запит одного елемента на сторінку зменшує розмір відповіді та прискорює її. Виведіть назви всіх продуктів у заданій категорії: ```python slug = 'lighting' url = f'{BASE_URL}/api/products/' params = {'category': slug} while url: data = requests.get(url, params=params).json() for product in data['results']: print(product['name']) url = data['next'] params = {} ```

Довідник ендпоінтів категорій

#
Ендпоінти категорій: ``` GET /api/categories/ Список усіх 13 категорій (з пагінацією) GET /api/categories/{slug}/ Одна категорія за slug ``` Поля об'єкта категорії: ``` id int Числовий ідентифікатор name string Назва для відображення (наприклад, 'Kitchen') slug string Ключ URL (наприклад, 'kitchen') — використовуйте в params ``` Доступні slug категорій: ``` all, kitchen, bedroom, living-room, office, hardware, decor, bathroom, kids-room, outdoor, dining-room, storage, lighting ``` Примітка: `all` — спеціальна категорія, що повертає всі продукти — еквівалент виклику /api/products/ без параметра category. Зв'язок категорій з продуктами: ```python # Використовуйте slug як параметр фільтра category= requests.get(f'{BASE_URL}/api/products/', params={'category': cat['slug']}) ```
01

Список усіх категорій

#

Отримайте список категорій та виведіть назву кожної категорії, по одній на рядок.

import requests

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

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

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

response = requests.get(f'{BASE_URL}/api/categories/')
for cat in response.json()['results']:
    print(cat['name'])
02

Словник slug → назва

#

Отримайте всі категорії та побудуйте dict, що відображає кожен slug на його назву для відображення. Виведіть цей dict.

import requests

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

# Побудуйте dict {slug: name} і виведіть його
Рішення
import requests

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

response = requests.get(f'{BASE_URL}/api/categories/')
categories = response.json()['results']
slug_to_name = {cat['slug']: cat['name'] for cat in categories}
print(slug_to_name)
03

Отримати одну категорію

#

Отримайте категорію "outdoor" за її slug та виведіть її id, name і slug.

import requests

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

# Отримайте категорію outdoor і виведіть id, name, slug
Рішення
import requests

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

response = requests.get(f'{BASE_URL}/api/categories/outdoor/')
cat = response.json()
print(cat['id'])
print(cat['name'])
print(cat['slug'])
04

Кількість продуктів на категорію

#

Для кожної категорії виведіть її назву і загальну кількість продуктів. Формат кожного рядка: "Назва категорії: N продуктів".

import requests

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

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

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

categories = requests.get(f'{BASE_URL}/api/categories/').json()['results']

for cat in categories:
    count = requests.get(
        f'{BASE_URL}/api/products/',
        params={'category': cat['slug'], 'page_size': 1},
    ).json()['count']
    print(f"{cat['name']}: {count} продуктів")
05

Знайти найбільшу категорію

#

Знайдіть категорію з найбільшою кількістю продуктів та виведіть її назву і кількість.

import requests

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

# Знайдіть категорію з найбільшою кількістю продуктів
Рішення
import requests

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

categories = requests.get(f'{BASE_URL}/api/categories/').json()['results']

counts = []
for cat in categories:
    count = requests.get(
        f'{BASE_URL}/api/products/',
        params={'category': cat['slug'], 'page_size': 1},
    ).json()['count']
    counts.append((count, cat['name']))

best_count, best_name = max(counts)
print(f'{best_name}: {best_count} продуктів')