web-dev-qa-db-ja.com

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も機能しません。ここで何が間違っていますか?

52
Seperman

ObjectDoesNotExistの代わりにDoesNotExistを使用するか、おそらくself.DoesNotExist。他のすべてが失敗した場合は、Vanilla Exceptionをキャッチして評価し、type()かどうかを確認してください。

from Django.core.exceptions import ObjectDoesNotExist

101
Jeff Triplett

パンチコ​​アが示唆したように、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
10
danbal

objects = MyManager()と言う場合、Manager.model(self.model)インスタンスからDoesNotExistを使用できます。MyManagerクラス内でself.modelを割り当てます。

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

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