Menu
CoddyTech

Una tarea por ID

Parte de la sección API JSON del Journey de Django de Coddy. Lección 3 de 19.

Un programa que ahora leía la lista quiere obtener una tarea en su propia URL: /api/tasks/1/. La ruta recibe el id con <int:pk>, como lo hacían tus páginas de detalle, y la función auxiliar task_to_dict(task) del proyecto inicial convierte una tarea en un diccionario.

La novedad es que la tarea no exista. get_object_or_404 responde con la página HTML 404 de Django, que un programa no puede leer. Una API también responde a los errores en JSON, con el código de estado adecuado, el número que indica cómo fue una solicitud: 200 Correcto, 403 Prohibido, 404 No encontrado. JsonResponse lo recibe como status:

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

Para elegir entre el error y la tarea, busca la fila sin provocar una excepción: filter(pk=...).first() devuelve la fila, o None si no hay ninguna.

challenge icon

Desafío

Fácil

Añade el punto de acceso para una tarea:

  • Una vista task_detail(request, pk) que devuelve task_to_dict(task) como JSON.
  • Para un id inexistente, {"error": "Task not found"} con el estado 404.
  • La ruta "api/tasks/<int:pk>/", llamada task_detail.

Pulsa Ejecutar y después abre /api/tasks/1/ y /api/tasks/99/.

Pruébalo tú mismo

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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de API JSON

Practica por tu cuenta: Playground de Django