From 535653877109f098789dc93ac944aa722a6b1238 Mon Sep 17 00:00:00 2001 From: Cristopher Hernandez <22552070+CristopherH95@users.noreply.github.com> Date: Sat, 8 Nov 2025 09:42:16 -0800 Subject: [PATCH 1/2] Implement afilter_queryset method --- adrf/generics.py | 14 +++++++++++++- adrf/mixins.py | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/adrf/generics.py b/adrf/generics.py index d15722f..eaffe41 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,18 @@ 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: From 04bec346c0e3b975e0da8e18b426f639a02151c0 Mon Sep 17 00:00:00 2001 From: Cristopher Hernandez <22552070+CristopherH95@users.noreply.github.com> Date: Sat, 8 Nov 2025 15:28:51 -0800 Subject: [PATCH 2/2] Reformat code --- adrf/generics.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/adrf/generics.py b/adrf/generics.py index eaffe41..61e241c 100644 --- a/adrf/generics.py +++ b/adrf/generics.py @@ -58,9 +58,13 @@ async def afilter_queryset(self, queryset): 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) + queryset = await backend_instance.filter_queryset( + self.request, queryset, self + ) else: - queryset = await sync_to_async(backend_instance.filter_queryset)(self.request, queryset, self) + queryset = await sync_to_async(backend_instance.filter_queryset)( + self.request, queryset, self + ) return queryset def paginate_queryset(self, queryset):