diff --git a/adrf/generics.py b/adrf/generics.py index d15722f..61e241c 100644 --- a/adrf/generics.py +++ b/adrf/generics.py @@ -31,7 +31,7 @@ async def aget_object(self): queryset lookups. Eg if objects are referenced using multiple keyword arguments in the url conf. """ - queryset = self.filter_queryset(self.get_queryset()) + queryset = await self.afilter_queryset(self.get_queryset()) # Perform the lookup filtering. lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field @@ -51,6 +51,22 @@ async def aget_object(self): return obj + async def afilter_queryset(self, queryset): + """ + Given a queryset, filter it with whichever filter backend is in use. + """ + for backend in list(self.filter_backends): + backend_instance = backend() + if asyncio.iscoroutinefunction(backend_instance.filter_queryset): + queryset = await backend_instance.filter_queryset( + self.request, queryset, self + ) + else: + queryset = await sync_to_async(backend_instance.filter_queryset)( + self.request, queryset, self + ) + return queryset + def paginate_queryset(self, queryset): """ Return a single page of results, or `None` if pagination is disabled. diff --git a/adrf/mixins.py b/adrf/mixins.py index e9217d8..08a7cea 100644 --- a/adrf/mixins.py +++ b/adrf/mixins.py @@ -35,7 +35,7 @@ class ListModelMixin(mixins.ListModelMixin): """ async def alist(self, *args, **kwargs): - queryset = self.filter_queryset(self.get_queryset()) + queryset = await self.afilter_queryset(self.get_queryset()) page = await self.apaginate_queryset(queryset) if page is not None: