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?
python
django
exception
django-custom-manager
Seperman
quelle
quelle
Antworten:
Versuchen Sie entweder über
ObjectDoesNotExist
stattDoesNotExist
oder möglicherweiseself.DoesNotExist
. Wenn alles andere fehlschlägt, versuchen Sie einfach, eine Vanille zu fangenException
und bewerten Sie sie, um festzustellen, ob sie typisiert ist ().from django.core.exceptions import ObjectDoesNotExist
quelle
NameError: global name 'DoesNotExist' is not defined
Also muss ich DoesNotExist von irgendwoher importieren. Ich nahm an, dass es in models.Model ist, aber models.Model.DoesNotExist nicht funktioniert hat.task.DoesNotExist
oderObjectDoesNotExist
.ObjectDoesNotExist
? Die andere Syntax könnte self.model.DoesNotExist sein ... aber ich bin mir nicht sicher.from django.db.models.base import ObjectDoesNotExist
Danke!Wie Panchicore vorgeschlagen hat,
self.model
ist 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
quelle
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)
quelle
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
quelle
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
quelle