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} продуктов')