diff --git a/django_filters/rest_framework/backends.py b/django_filters/rest_framework/backends.py index bb2ae352..4bb19227 100644 --- a/django_filters/rest_framework/backends.py +++ b/django_filters/rest_framework/backends.py @@ -1,22 +1,32 @@ +from __future__ import annotations + import warnings +from typing import TYPE_CHECKING, Any, TypeVar from django.template import loader from .. import compat, utils from . import filters, filterset +if TYPE_CHECKING: + from django.db.models.query import QuerySet + from rest_framework.generics import GenericAPIView + from rest_framework.request import Request + + Q = TypeVar("Q", bound=QuerySet[Any]) + class DjangoFilterBackend: filterset_base = filterset.FilterSet raise_exception = True @property - def template(self): + def template(self) -> str: if compat.is_crispy(): return "django_filters/rest_framework/crispy_form.html" return "django_filters/rest_framework/form.html" - def get_filterset(self, request, queryset, view): + def get_filterset(self, request: Request, queryset: QuerySet[Any], view: GenericAPIView) -> filterset.FilterSet | None: filterset_class = self.get_filterset_class(view, queryset) if filterset_class is None: return None @@ -24,7 +34,7 @@ def get_filterset(self, request, queryset, view): kwargs = self.get_filterset_kwargs(request, queryset, view) return filterset_class(**kwargs) - def get_filterset_class(self, view, queryset=None): + def get_filterset_class(self, view: GenericAPIView, queryset: QuerySet[Any] | None = None) -> type[filterset.FilterSet] | None: """ Return the `FilterSet` class used to filter the queryset. """ @@ -57,14 +67,14 @@ class Meta(MetaBase): return None - def get_filterset_kwargs(self, request, queryset, view): + def get_filterset_kwargs(self, request: Request, queryset: QuerySet[Any], view: GenericAPIView) -> dict[str, Any]: return { "data": request.query_params, "queryset": queryset, "request": request, } - def filter_queryset(self, request, queryset, view): + def filter_queryset(self, request: Request, queryset: Q, view: Any) -> Q: filterset = self.get_filterset(request, queryset, view) if filterset is None: return queryset @@ -73,7 +83,7 @@ def filter_queryset(self, request, queryset, view): raise utils.translate_validation(filterset.errors) return filterset.qs - def to_html(self, request, queryset, view): + def to_html(self, request: Request, queryset: QuerySet, view: GenericAPIView) -> str | None: filterset = self.get_filterset(request, queryset, view) if filterset is None: return None @@ -129,7 +139,7 @@ def get_schema_fields(self, view): ] ) - def get_schema_operation_parameters(self, view): + def get_schema_operation_parameters(self, view: GenericAPIView) -> Any: from django_filters import RemovedInDjangoFilter25Warning warnings.warn( "Built-in schema generation is deprecated. Use drf-spectacular.",