Menu
CoddyTech

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.

challenge icon

Aufgabe

Einfach

Füge einen Endpunkt für eine Aufgabe hinzu.

  1. Füge in tasks/views.py task_detail(request, pk) hinzu. Die Funktion gibt task_to_dict(task) als JSON zurück. Wenn keine Aufgabe mit dieser ID vorhanden ist, antworte mit dem Status 404 und {"error": "Task not found"}.
  2. Füge in tasks/urls.py die Route "api/tasks/<int:pk>/" mit dem Namen task_detail hinzu.

Ö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)
quiz iconTeste dich selbst

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