Python · API · Середній рівень

Замовлення

5 завдань

Оформлюйте замовлення з кошика та переглядайте історію своїх замовлень.

Процес замовлення та ендпоінти

#
Замовлення представляє покупку — воно фіксує вміст кошика у певний момент часу. Після оформлення кошик автоматично очищується, а замовлення стає доступним в історії покупок. Процес замовлення складається з двох етапів: 1. Наповнити кошик — додайте продукти через POST /api/cart/items/ (розглядається в темі cart). 2. Оформити замовлення — зробіть POST до /api/orders/ із номером телефону у тілі. Ендпоінти замовлень: ``` POST /api/orders/ Оформити замовлення з поточного кошика GET /api/orders/ Список усіх ваших минулих замовлень GET /api/orders/{id}/ Деталі одного замовлення ``` Усі ендпоінти замовлень вимагають авторизації. Оформлене замовлення виглядає так: ```json { "id": 5, "created_timestamp": "2025-06-23T10:15:00Z", "phone_number": "+1234567890", "status": "Processing", "items": [ {"id": 5, "name": "Oak Chair", "price": "149.99", "quantity": 2} ] } ``` Зверніть увагу: елементи плоскі — кожен елемент має name, price і quantity безпосередньо, без вкладення під ключ product. Поле price фіксує ціну на момент покупки.

Оформлення та перегляд замовлень

#
Повний процес — реєстрація, додавання товарів, оформлення замовлення, перегляд історії: ```python import requests BASE_URL = 'https://apilearn.tukas.dev' # Авторизація token = requests.post(f'{BASE_URL}/api/auth/token/', json={ 'username': 'alice42', 'password': 'securepass123', }).json()['token'] session = requests.Session() session.headers['Authorization'] = f'Token {token}' # Додати два продукти до кошика products = session.get(f'{BASE_URL}/api/products/').json()['results'] for product in products[:2]: session.post(f'{BASE_URL}/api/cart/items/', json={ 'product_slug': product['slug'], 'quantity': 1, }) # Оформити замовлення — phone_number обов'язковий response = session.post(f'{BASE_URL}/api/orders/', json={'phone_number': '+1234567890'}) print(response.status_code) # 201 Created order = response.json() print('Id замовлення:', order['id']) print('Статус:', order['status']) print('Товарів:', len(order['items'])) ``` Список усіх замовлень: ```python orders = session.get(f'{BASE_URL}/api/orders/').json() print(f'У вас {orders["count"]} замовлень') for o in orders['results']: print(f" Замовлення #{o['id']} — {o['status']}") ``` Список замовлень є пагінованим, як і продукти. Кожен елемент у results має id, status, created_timestamp і items. Отримати детальну інформацію про конкретне замовлення: ```python order_id = orders['results'][0]['id'] detail = session.get(f'{BASE_URL}/api/orders/{order_id}/').json() for item in detail['items']: print(f" {item['name']} x{item['quantity']} @ {item['price']}") ``` Якщо спробувати POST /api/orders/ із порожнім кошиком — отримаєте помилку 400. Завжди перевіряйте, що в кошику є товари.

Довідник ендпоінтів замовлень

#
Ендпоінти замовлень (усі вимагають авторизації): ``` POST /api/orders/ Оформити замовлення з поточного кошика тіло: {phone_number: str} повертає: 201 + об'єкт замовлення помилка: 400, якщо кошик порожній GET /api/orders/ Список усіх замовлень (з пагінацією) повертає: {count, next, previous, results: [...]} GET /api/orders/{id}/ Деталі замовлення повертає: повний об'єкт замовлення з елементами ``` Поля об'єкта замовлення: ``` id int Id замовлення created_timestamp string ISO 8601 timestamp phone_number string Номер телефону, вказаний при оформленні status string наприклад, "Processing" items list Список елементів замовлення ``` Об'єкт елемента замовлення: ``` id int Id елемента name string Назва продукту на момент покупки price string Ціна на момент покупки quantity int Замовлена кількість ```
01

Оформити замовлення

#

Додайте хоча б один продукт до кошика, потім зробіть POST до /api/orders/, щоб оформити замовлення. Виведіть id замовлення і статус із відповіді.

import requests

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

# 1. Авторизуйтеся
# 2. Додайте продукт до кошика
# 3. POST /api/orders/ і виведіть id замовлення + статус
Рішення
import requests

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

token = requests.post(f'{BASE_URL}/api/auth/token/', json={
    'username': 'ВАШ_ЛОГІН', 'password': 'ВАШ_ПАРОЛЬ',
}).json()['token']

headers = {'Authorization': f'Token {token}'}

product_slug = requests.get(f'{BASE_URL}/api/products/').json()['results'][0]['slug']
requests.post(
    f'{BASE_URL}/api/cart/items/',
    json={'product_slug': product_slug, 'quantity': 1},
    headers=headers,
)

order = requests.post(
    f'{BASE_URL}/api/orders/',
    json={'phone_number': '+1234567890'},
    headers=headers,
).json()
print(order['id'])
print(order['status'])
02

Список замовлень

#

Отримайте історію замовлень із GET /api/orders/. Виведіть кількість замовлень і id та статус кожного.

import requests

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

# GET /api/orders/ і виведіть кількість + кожне замовлення
Рішення
import requests

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

token = requests.post(f'{BASE_URL}/api/auth/token/', json={
    'username': 'ВАШ_ЛОГІН', 'password': 'ВАШ_ПАРОЛЬ',
}).json()['token']

headers = {'Authorization': f'Token {token}'}
data = requests.get(f'{BASE_URL}/api/orders/', headers=headers).json()
print(f'{data["count"]} замовлень')
for order in data['results']:
    print(f"  #{order['id']} — {order['status']}")
03

Деталі замовлення

#

Оформте замовлення, потім отримайте його деталі з GET /api/orders/{id}/. Виведіть назву, кількість і ціну кожного товару.

import requests

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

# 1. Авторизуйтеся, додайте товари, оформте замовлення
# 2. GET /api/orders/{id}/ і виведіть кожен товар
Рішення
import requests

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

token = requests.post(f'{BASE_URL}/api/auth/token/', json={
    'username': 'ВАШ_ЛОГІН', 'password': 'ВАШ_ПАРОЛЬ',
}).json()['token']

headers = {'Authorization': f'Token {token}'}

products = requests.get(f'{BASE_URL}/api/products/').json()['results']
for p in products[:2]:
    requests.post(
        f'{BASE_URL}/api/cart/items/',
        json={'product_slug': p['slug'], 'quantity': 1},
        headers=headers,
    )

order = requests.post(
    f'{BASE_URL}/api/orders/',
    json={'phone_number': '+1234567890'},
    headers=headers,
).json()
order_id = order['id']

detail = requests.get(f'{BASE_URL}/api/orders/{order_id}/', headers=headers).json()
for item in detail['items']:
    print(item['name'], item['quantity'], item['price'])
04

Повний процес замовлення

#

Виконайте повний процес в одному скрипті: авторизуйтеся, додайте 3 продукти до кошика, оформте замовлення, підтвердіть що воно є в списку замовлень, і виведіть id замовлення та кількість товарів.

import requests

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

# Повний процес: авторизація → додавання 3 товарів → замовлення → підтвердження в списку
Рішення
import requests

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

token = requests.post(f'{BASE_URL}/api/auth/token/', json={
    'username': 'ВАШ_ЛОГІН', 'password': 'ВАШ_ПАРОЛЬ',
}).json()['token']

session = requests.Session()
session.headers['Authorization'] = f'Token {token}'

products = session.get(f'{BASE_URL}/api/products/').json()['results'][:3]
for p in products:
    session.post(f'{BASE_URL}/api/cart/items/', json={'product_slug': p['slug'], 'quantity': 1})

order = session.post(f'{BASE_URL}/api/orders/', json={'phone_number': '+1234567890'}).json()
order_id = order['id']

orders_list = session.get(f'{BASE_URL}/api/orders/').json()
order_ids = [o['id'] for o in orders_list['results']]
print(f'Замовлення {order_id} у списку: {order_id in order_ids}')
print(f'Товарів: {len(order["items"])}')
05

Обчислити загальну суму витрат

#

Оформте два окремих замовлення (додайте товари, оформте, додайте ще, оформте знову). Потім отримайте всі замовлення та обчисліть загальну суму витрат по всіх замовленнях. Виведіть суму.

import requests

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

# Оформте 2 замовлення, потім підсумуйте всі витрати
Рішення
import requests

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

token = requests.post(f'{BASE_URL}/api/auth/token/', json={
    'username': 'ВАШ_ЛОГІН', 'password': 'ВАШ_ПАРОЛЬ',
}).json()['token']

session = requests.Session()
session.headers['Authorization'] = f'Token {token}'

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

# Перше замовлення
session.post(f'{BASE_URL}/api/cart/items/', json={'product_slug': products[0]['slug'], 'quantity': 1})
session.post(f'{BASE_URL}/api/orders/', json={'phone_number': '+1234567890'})

# Друге замовлення
session.post(f'{BASE_URL}/api/cart/items/', json={'product_slug': products[1]['slug'], 'quantity': 2})
session.post(f'{BASE_URL}/api/orders/', json={'phone_number': '+1234567890'})

orders = session.get(f'{BASE_URL}/api/orders/').json()['results']
total_spend = sum(
    float(item['price']) * item['quantity']
    for o in orders
    for item in o['items']
)
print(f'Загальна сума: {total_spend:.2f}')