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 leía la lista ahora quiere 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 detalles, y el ayudante inicial task_to_dict(task) convierte una tarea en un diccionario.
La novedad es el caso de que falte una tarea. get_object_or_404 responde con la página HTML 404 de Django, que un programa no puede leer, así que una API también envía sus errores como JSON, con el código de estado adecuado, el número que indica cómo fue una solicitud: 200 OK, 403 Forbidden, 404 Not Found. 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.
Desafío
FácilAñade un punto de conexión para una tarea.
- En
tasks/views.py, añadetask_detail(request, pk). Responde contask_to_dict(task)en formato JSON. Cuando no haya ninguna tarea con ese id, responde con el estado404y{"error": "Task not found"}. - En
tasks/urls.py, añade la ruta"api/tasks/<int:pk>/"con el nombretask_detail.
Abre /api/tasks/99/: verás {"error": "Task not found"}.
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)
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de API JSON
2Lectura de solicitudes
Filtrar con una consultaCrear con POST5Proyecto: Organizar el trabajo
Proyecto: PrioridadesProyecto: Borrar las tareas completadasPractica por tu cuenta: Playground de Django