Abfangen der DoesNotExist-Ausnahme in einem benutzerdefinierten Manager in Django

69

Ich habe einen benutzerdefinierten Manager für ein Django-Modell. Ich scheine hier nicht in der Lage zu sein, die DoesNotExist-Ausnahme abzufangen. Ich weiß, wie es im Modell gemacht wird, aber hier hat es nicht funktioniert:

class TaskManager(models.Manager):
    def task_depend_tree(self, *args, **kwargs):
        if "id" in kwargs:
            try:
                task = self.get(id=kwargs["id"])
            except DoesNotExist:
                raise Http404

Get_object_or_404 funktioniert auch nicht. Was ist hier falsch?

Seperman
quelle
2
Was bedeutet "funktioniert nicht" in beiden Fällen? Was passiert eigentlich?
Daniel Roseman
@ DanielRoseman NameError: globaler Name 'DoesNotExist' ist nicht definiert
Seperman

Antworten:

125

Versuchen Sie entweder über ObjectDoesNotExiststatt DoesNotExistoder möglicherweise self.DoesNotExist. Wenn alles andere fehlschlägt, versuchen Sie einfach, eine Vanille zu fangen Exceptionund bewerten Sie sie, um festzustellen, ob sie typisiert ist ().

from django.core.exceptions import ObjectDoesNotExist

Jeff Triplett
quelle
Ich hatte Self.DoesNotExist ausprobiert und es schlug fehl. Der Fehler, den ich bekomme, wenn etwas in der Datenbank nicht vorhanden ist, ist: NameError: global name 'DoesNotExist' is not definedAlso muss ich DoesNotExist von irgendwoher importieren. Ich nahm an, dass es in models.Model ist, aber models.Model.DoesNotExist nicht funktioniert hat.
Seperman
self.DoesNotExist wird offensichtlich nicht helfen, da self existiert, wenn es eine solche Methode hat. Verwenden Sie stattdessen task.DoesNotExistoder ObjectDoesNotExist.
Philipp Zedler
Hast du meinen Vorschlag von versucht ObjectDoesNotExist? Die andere Syntax könnte self.model.DoesNotExist sein ... aber ich bin mir nicht sicher.
Jeff Triplett
9
Ich musste ObjectDoesNotExist importieren und es funktionierte, um DoesNotExist zu fangen: from django.db.models.base import ObjectDoesNotExist Danke!
Seperman
13

Wie Panchicore vorgeschlagen hat, self.modelist der richtige Weg.

class TaskManager(models.Manager):
    def task_depend_tree(self, *args, **kwargs):
        if "id" in kwargs:
            try:
                task = self.get(id=kwargs["id"])
            except self.model.DoesNotExist:
                raise Http404
danbal
quelle
2

Wenn Sie dies mit GenericViewSet auf einer Listenmethode (DRF) implementieren müssen und eine leere Liste zurückgeben müssen, verwenden Sie Folgendes:

    def list(self, request, *args, **kwargs):
    self.get_object() # I use this to trigger the object_permission
    try:
        queryset = self.queryset.filter(user=(YourModel.objects.get(user=request.user).user))
    except YourModel.DoesNotExist:
        return Response(YourModel.objects.none())

    serializer = YSourModelSerializer(queryset, many=True)
    return Response(serializer.data)
Théo T. Carranza
quelle
2

Sie können DoesNotExist aus der Instanz Manager.model (self.model) verwenden, wenn Sie angeben, dass objects = MyManager()Sie self.model in der MyManager-Klasse zuweisen.

        try:
            task = self.get(id=kwargs["id"])
            return task
        except self.DoesNotExist:
            return None
Panchicore
quelle
Dies wird nicht funktionieren. Sie müssen self.model.DoesNotExist
Sudhakaran Packianathan
0

Ich gehe mit der Ausnahme so um und es hat funktioniert.

from django.core.exceptions import ObjectDoesNotExist

try:
    task = self.get(id=kwargs["id"])
except ObjectDoesNotExist as DoesNotExist:
    raise Http404

Santi Rodriguez
quelle