2013-01-10 23 views
40

Djangoモデルのカスタムマネージャがあります。私はここでDoesNotExist例外を捕まえることができないようです。私は、モデル内でそれを行う方法を知っているが、それはここでは動作しませんでした:Get_object_or_404はどちらか動作しません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 

。 ここで何が間違っていますか?

+2

意味どちらの場合も?実際に何が起こるのですか? –

+0

@DanielRoseman NameError:グローバル名 'DoesNotExist'が定義されていません – Seperman

答えて

76

DoesNotExistまたはおそらくself.DoesNotExistの代わりにObjectDoesNotExistを使用してください。他のすべてがうまくいかない場合は、バニラExceptionを試してみて、それを評価してtype()を見てください。

from django.core.exceptions import ObjectDoesNotExist

+0

私はSelf.DoesNotExistを試してみましたが失敗しました。データベースに何かが存在しないときにエラーが発生する: 'NameError:グローバル名 'DoesNotExist'が定義されていないので、どこかからDoesNotExistをインポートする必要があります。私はそれがモデルであることを前提としていました.Modelではなくmodels.Model.DoesNotExistは機能しませんでした。 – Seperman

+0

self.DoesNotExistは、このようなメソッドを持っていると自己が存在するため、明らかに助けにならないでしょう。代わりに 'task.DoesNotExist'または' ObjectDoesNotExist'を使用してください。 –

+0

私の提案した 'ObjectDoesNotExist'を試しましたか?他の構文はself.model.DoesNotExist ...かもしれませんが、私は頭の上からは分かりません。 –

1

あなたはMyManagerクラス内self.modelを割り当てるobjects = MyManager()言うとき、あなたは 、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)