2013-01-10 3 views
40

장고 모델에 대한 사용자 지정 관리자가 있습니다. DoNotExist 예외를 여기 잡을 수있는 것 같지 않습니다. 모델 내부에서 수행하는 방법을 알고 있지만 여기서는 작동하지 않습니다.장고 사용자 지정 관리자에서 DoesNotExist 예외 잡기

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가 작동하지 않습니다. 여기에 무슨 문제가 있습니까?

+2

의미 두 경우 모두? 실제로는 어떻게됩니까? –

+0

@DanielRoseman NameError : 글로벌 이름 'DoesNotExist'가 정의되지 않았습니다 – Seperman

답변

76

DoesNotExist 또는 self.DoesNotExist 대신 ObjectDoesNotExist을 사용해보십시오. 다른 모든 방법이 실패하면 바닐라 Exception을 잡아서 평가하여 type()을 확인하십시오. 당신은 당신이 MyManager 클래스 내부 self.model를 할당하는 objects = MyManager()을 말할 때

from django.core.exceptions import ObjectDoesNotExist

+0

Self.DoesNotExist를 시도했지만 실패했습니다. 데이터베이스에 무언가가 존재하지 않으면 오류가 발생합니다 :'NameError : global name 'DoesNotExist'not defined' 그래서 어딘가에서 DoesNotExist를 가져와야합니다. 내가 모델에 있다고 가정 했어. 모델이지만 모델. 모델 .DotNotExist가 작동하지 않았다. – Seperman

+0

self.DoesNotExist는 분명히 도움이되지 않습니다. 대신에'task.DoesNotExist' 또는'ObjectDoesNotExist'를 사용하십시오. –

+0

당신은'ObjectDoesNotExist'에 대한 제 제안을 시도 했습니까? 다른 문법은 self.model.DoesNotExist일지도 모르지만 ... 내 머리 꼭대기에서 잘 모르겠습니다. –

1

당신은 Manager.model (self.model) 예, 에서 DoesNotExist를 사용할 수 있습니다.

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

'self'는 모델이 아니라 매니저입니다 – imns

+0

이것은 작동하지 않습니다. self.model.DoesNotExist를 사용해야합니다. –

8

panchicore가 제안한대로 self.model이 좋습니다.

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 
0

당신이 반환 될 GenericViewSet를 사용하여 목록 방식 (DRF)에이를 구현하고, 빈 목록이 필요해야하는 경우, 이것을 사용 : "작동하지 않습니다"무엇

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) 
관련 문제