web-dev-qa-db-fra.com

Attraper l'exception DoesNotExist dans un gestionnaire personnalisé dans Django

J'ai un gestionnaire personnalisé pour un modèle Django. Je ne semble pas pouvoir attraper l'exception DoesNotExist ici. Je sais comment le faire à l'intérieur du modèle mais cela n'a pas fonctionné ici:

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 ne fonctionne pas non plus . Qu'est-ce qui ne va pas ici?

47
Seperman

Essayez d’utiliser ObjectDoesNotExist au lieu de DoesNotExist ou éventuellement self.DoesNotExist. Si tout échoue, essayez simplement d'attraper une Exception vanille et de l'évaluer pour voir si elle est de type ().

from Django.core.exceptions import ObjectDoesNotExist

93
Jeff Triplett

Comme suggéré par panchicore, self.model est la voie à suivre.

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

vous pouvez utiliser DoesNotExist à partir de l'instance Manager.model (self.model), lorsque vous dites objects = MyManager(), vous affectez self.model dans la classe MyManager.

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

Si vous devez implémenter ceci sur une méthode de liste (DRF) à l'aide de GenericViewSet et que vous avez besoin de retourner une liste vide, utilisez ceci:

    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
Théo T. Carranza