2013-01-10 67 views
40

我有一個Django模型的自定義管理器。我似乎無法在這裏捕獲DoesNotExist異常。我知道如何做到這一點的模型內,但它並沒有在這裏工作:在Django的自定義管理器中捕獲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

嘗試使用ObjectDoesNotExist而不是DoesNotExist或可能self.DoesNotExist。如果所有其他都失敗了,只需嘗試並捕獲一個香草Exception並評估它以查看它的類型()。

from django.core.exceptions import ObjectDoesNotExist

+0

我曾嘗試過Self.DoesNotExist,但失敗了。數據庫中不存在的錯誤是:NameError:全局名稱DoesNotExist未定義所以我需要從某處導入DoesNotExist。我認爲它是在models.Model,但models.Model.DoesNotExist沒有工作。 – Seperman

+0

self.DoesNotExist顯然不會幫助,因爲如果它有這樣的方法,它就存在。改爲使用'task.DoesNotExist'或'ObjectDoesNotExist'。 –

+0

你嘗試了我的'ObjectDoesNotExist'的建議嗎?其他的語法可能是self.model.DoesNotExist ...但我不確定我的頭頂。 –

1

當你說objects = MyManager()要分配MyManager類中self.model可以使用從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)