Menu
CoddyTech

Одна задача по ID

Часть раздела JSON API путешествия по Django на Coddy. Урок 3 из 19.

Программа, которая читала список, теперь хочет получить одну задачу по её URL: /api/tasks/1/. Маршрут принимает идентификатор с помощью <int:pk>, как и ваши страницы с подробной информацией, а вспомогательная функция из заготовки task_to_dict(task) преобразует задачу в словарь.

Новое здесь — отсутствующая задача. get_object_or_404 возвращает HTML-страницу 404 от Django, которую программа не может прочитать, поэтому API отправляет ошибки тоже в формате JSON, с правильным кодом состояния — числом, которое показывает, как прошёл запрос: 200 OK, 403 Forbidden, 404 Not Found. JsonResponse принимает его как status:

return JsonResponse({"error": "Staff only"}, status=403)

Чтобы выбрать между ошибкой и задачей, найдите строку без вызова исключения: filter(pk=...).first() возвращает строку или None, если её нет.

challenge icon

Задание

Легко

Добавь конечную точку для одной задачи.

  1. В tasks/views.py добавь task_detail(request, pk). Она возвращает task_to_dict(task) в формате JSON. Если задачи с таким идентификатором нет, верни статус 404 и {"error": "Task not found"}.
  2. В tasks/urls.py добавь маршрут "api/tasks/<int:pk>/" с именем task_detail.

Открой /api/tasks/99/: ты увидишь {"error": "Task not found"}.

Попробуйте сами

from django.http import JsonResponse
from django.shortcuts import render

from .models import Task


def task_to_dict(task):
    return {
        "id": task.id,
        "title": task.title,
        "done": task.done,
        "priority": task.priority,
    }


def home(request):
    return render(request, "tasks/home.html", {"tasks": Task.objects.all()})


def stats(request):
    data = {
        "total": Task.objects.count(),
        "done": Task.objects.filter(done=True).count(),
    }
    return JsonResponse(data)


def task_list(request):
    tasks = Task.objects.values("id", "title", "done", "priority")
    return JsonResponse(list(tasks), safe=False)
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела JSON API

Потренируйтесь самостоятельно: Песочница Django