Menu
CoddyTech

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

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

Программа, которая читала список, теперь хочет получить одну задачу по её собственному URL: /api/tasks/1/. Маршрут получает id через <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

Задание

Легко

Добавь эндпоинт для одной задачи:

  • Представление task_detail(request, pk), которое возвращает task_to_dict(task) в формате JSON.
  • Если идентификатор не найден, возвращай {"error": "Task not found"} со статусом 404.
  • Маршрут "api/tasks/<int:pk>/" с именем task_detail.

Нажми Run, затем открой /api/tasks/1/ и /api/tasks/99/.

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

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