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?
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
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
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
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)