runserver - python django tutorial




Wie gehe ich mit Djangos objects.get am besten um? (5)

Wann immer ich das tue:

thepost = Content.objects.get(name="test")

Es wird immer ein Fehler ausgegeben, wenn nichts gefunden wird. Wie gehe ich damit um?


Das Auslösen einer Http404-Ausnahme funktioniert hervorragend:

from django.http import Http404

def detail(request, poll_id):
    try:
        p = Poll.objects.get(pk=poll_id)
    except Poll.DoesNotExist:
        raise Http404
    return render_to_response('polls/detail.html', {'poll': p})

Das Behandeln von Ausnahmen an verschiedenen Stellen in Ihren Ansichten kann sehr umständlich sein. Sie können beispielsweise einen benutzerdefinierten Modell-Manager in der Datei models.py definieren

class ContentManager(model.Manager):
    def get_nicely(self, **kwargs):
        try:
            return self.get(kwargs)
        except(KeyError, Content.DoesNotExist):
            return None

und dann in die Klasse content Model aufnehmen

class Content(model.Model):
    ...
    objects = ContentManager()

Auf diese Weise kann es leicht in den Ansichten behandelt werden, dh

post = Content.objects.get_nicely(pk = 1)
if post != None:
    # Do something
else:
    # This post doesn't exist

Fang die Ausnahme ab

try:
    thepost = Content.objects.get(name="test")
except Content.DoesNotExist:
    thepost = None

Alternativ können Sie filtern, wodurch eine leere Liste zurückgegeben wird, wenn nichts passt

posts = Content.objects.filter(name="test")
if posts:
    # do something with posts[0] and see if you want to raise error if post > 1

Oft ist es sinnvoller, die Django-Shortcut-Funktion get_object_or_404 anstelle der API direkt zu verwenden:

from django.shortcuts import get_object_or_404

thepost = get_object_or_404(Content, name='test')

Ziemlich offensichtlich wird dies einen 404-Fehler auslösen, wenn das Objekt nicht gefunden werden kann, und Ihr Code wird fortgesetzt, wenn es erfolgreich ist.


try:
    thepost = Content.objects.get(name="test")
except Content.DoesNotExist:
    thepost = None

Verwenden Sie die Model DoesNotExist-Ausnahme







django