Ich habe eine einfache Blog-App mit dem Modell "Post". Wenn ich alle Einträge im Post-Modell lösche, erhalte ich einen Fehler, wenn ich versuche, das erste Element in der nach Datum sortierten Post-Liste zu referenzieren, was mir gefallen hat:
%Vor%Der Fehler ist: IndexError: Listenindex außerhalb des Bereichs
Zur Behebung bekomme ich den Artikel jetzt so:
%Vor%Dies funktioniert, wenn sich in meinem Modell "Post" keine Objekte befinden und keine Ausnahme ausgelöst wird. Für mich scheint dies jedoch zu viel Code zu sein, um etwas ziemlich Einfaches zu tun. Ich nehme an, dass es eine bessere Möglichkeit gibt, dies mit der django QuerySet-API zu tun, aber in der Dokumentation nichts finden kann.
Irgendwelche Ideen?
BEARBEITEN: Seltsamerweise verursacht dies keinen Fehler, wenn sich im Post-Modell keine Elemente befinden:
%Vor%Nichts Seltsames daran, es ist völlig zu erwarten. Eine leere Liste (oder speziell in diesem Fall ein Abfrage-Set) wird als False ausgewertet, sodass Sie niemals in das Abfrage-Set indizieren. Während, wenn Sie versuchen, in eine leere Liste zu indizieren (wie Sie mit der ersten Annäherung tun), wirft es einen IndexError.
Was du geschrieben hast, wird funktionieren, aber es ist nicht das beste Imo. Eine bessere Möglichkeit, dies zu schreiben, wäre wie folgt:
%Vor%Dies ist eine eher pythische Art, es zu schreiben und es ist leichter zu lesen und zu verstehen, was Sie tun möchten.
Oder noch besser
%Vor% Beachten Sie in diesem zweiten Beispiel, dass es die letzte () Methode querieset verwendet. Beachten Sie auch, dass das Argument einfach der Feldname und nicht-Feldname ist. Sie können auch in Ihren Modellen die Meta-Klasse get_latest_by = 'date_created'
angeben und dann wird die Zeile einfach zu latest_post = Post.objects.latest()
, ohne dass Sie das Feldname-Argument
Dies wird keine Ausnahme auslösen und Sie können immer noch nach einer leeren Listenbedingung auf "latest_post" suchen.
Ihr Problem ergibt sich aus der Verwendung eines absoluten Index IE: [0], der vorhanden sein kann oder nicht. Wenn Sie eine Scheibe [: 1] verwenden, sagen Sie, dass Sie eine Liste mit dem ersten Element in der Liste wünschen, wenn es existiert ... wenn es nicht existiert, erhalten Sie einfach eine leere Liste.
Tags und Links django django-queryset