Eine Aufgabe anhand der ID
Teil des Abschnitts JSON-APIs der Django-Journey von Coddy. Lektion 3 von 19.
Ein Programm, das die Liste gelesen hat, möchte jetzt eine einzelne Aufgabe unter ihrer eigenen URL abrufen: /api/tasks/1/. Die Route übernimmt die ID mit <int:pk>, wie bei deinen Detailseiten, und die Hilfsfunktion task_to_dict(task) des Startercodes wandelt eine Aufgabe in ein Dictionary um.
Neu ist der Fall, dass eine Aufgabe fehlt. get_object_or_404 gibt Django's HTML-404-Seite zurück, die ein Programm nicht lesen kann. Deshalb sendet eine API ihre Fehler ebenfalls als JSON, mit dem passenden Statuscode, also der Zahl, die angibt, wie eine Anfrage ausgegangen ist: 200 OK, 403 Forbidden, 404 Not Found. JsonResponse übernimmt ihn als status:
return JsonResponse({"error": "Staff only"}, status=403)Um zwischen dem Fehler und der Aufgabe zu wählen, suche den Datensatz ab, ohne eine Ausnahme auszulösen: filter(pk=...).first() gibt den Datensatz zurück oder None, wenn keiner vorhanden ist.
Aufgabe
EinfachFüge einen Endpunkt für eine Aufgabe hinzu.
- Füge in
tasks/views.pytask_detail(request, pk)hinzu. Die Funktion gibttask_to_dict(task)als JSON zurück. Wenn keine Aufgabe mit dieser ID vorhanden ist, antworte mit dem Status404und{"error": "Task not found"}. - Füge in
tasks/urls.pydie Route"api/tasks/<int:pk>/"mit dem Namentask_detailhinzu.
Öffne /api/tasks/99/: Du siehst {"error": "Task not found"}.
Probier es selbst
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)
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in JSON-APIs
Übe selbstständig: Django-Playground