Как упростить код и надо ли?

Работаю на API в Django REST Framework.И вот есть такая проблемка:есть ModelViewSet и в их функциях происходит один и тот же запрос в базу, одна и та же проверка в блоке if.Можно ли как-то это дело вынести в отдельную функцию и если да, то как?

class LinkViewSet(ModelViewSet):
    permission_classes = (IsAuthenticated,)
    serializer_class = LinkSerializer
    queryset = Link.objects.all()


    def retrieve(self, request, *args, **kwargs):
        instance = Link.objects.filter(Q(user_id=self.request.user.id) & Q(id=kwargs["pk"])).first()

        if not instance:
            return Response(data="Not found", status=status.HTTP_404_NOT_FOUND)

        return super().retrieve(request, *args, **kwargs)

    def partial_update(self, request, *args, **kwargs):
        instance = Link.objects.filter(Q(user_id=self.request.user.id) & Q(id=kwargs["pk"])).first()

        if not instance:
            return Response(data="Not found", status=status.HTTP_404_NOT_FOUND)

        return super().partial_update(request, *args, **kwargs)

Ответы (1 шт):

Автор решения: gimntut

Весь viewset можно переписать следующим образом:

class LinkViewSet(ModelViewSet):
    permission_classes = (IsAuthenticated,)
    serializer_class = LinkSerializer
    queryset = Link.objects.all()


    def get_queryset(self):
        qs = super().get_queryset()
        qs = qs.filter(user_id=self.request.user.id)
        # qs будет передан в GenericAPIView.get_object, 
        # который будет искать по pk и создаст 404-ответ, если нет подходящего элемента
        return qs 

Результат выполнения будет такой же, как и в коде из вопроса

→ Ссылка