it-swarm.com.de

Ausnahme der DoesNotExist-Ausnahme in einem benutzerdefinierten Manager in Django

Ich habe einen benutzerdefinierten Manager für ein Django-Modell. Ich kann die DoesNotExist-Ausnahme hier nicht abfangen. Ich weiß, wie man es im Modell macht, 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?

47
Seperman

Versuchen Sie entweder ObjectDoesNotExist anstelle von DoesNotExist oder möglicherweise self.DoesNotExist. Wenn alles andere fehlschlägt, versuchen Sie einfach, eine Vanilla Exception zu fangen und auszuwerten, um ihren Typ () zu sehen.

from Django.core.exceptions import ObjectDoesNotExist

93
Jeff Triplett

Wie von panchicore vorgeschlagen, ist self.model 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
10
danbal

sie können die DoesNotExist-Instanz aus der Manager.model-Instanz (self.model) verwenden. Wenn Sie objects = MyManager() sagen, weisen Sie der MyManager-Klasse self.model zu.

        try:
            task = self.get(id=kwargs["id"])
            return task
        except self.DoesNotExist:
            return None
2
panchicore

Wenn Sie dies für eine Listenmethode (DRF) mit GenericViewSet 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)
0