python - OrderingFilter has no attribute 'filter_queryset' -
i have been trying orderingfilter work. example in django-rest-framework's page, seems should straightforward:
class userlistview(generics.listapiview): queryset = user.objects.all() serializer_class = userserializer filter_backends = (filters.orderingfilter,) ordering_fields = ('username', 'email')
however, when try that:
from django_filters.rest_framework import djangofilterbackend, filterset, orderingfilter ... class listingviewset(viewsets.modelviewset): queryset = listing.objects.all() serializer_class = listingserializer filter_backends = (djangofilterbackend, orderingfilter,) filter_class = listfilter ordering_fields = ('price', 'views') ordering = ('price',)
i error orderingfilter
not having filter_queryset
attribute:
error 2016-11-13 03:14:57,304 log 25913 123145338523648 (<class 'attributeerror'>, attributeerror("'orderingfilter' object has no attribute 'filter_queryset'",), <traceback object @ 0x106ef48c8>) traceback (most recent call last): file "/.../lib/python3.5/site-packages/rest_framework/views.py", line 474, in dispatch response = handler(request, *args, **kwargs) file "/.../lib/python3.5/site-packages/rest_framework/mixins.py", line 40, in list queryset = self.filter_queryset(self.get_queryset()) file "/.../lib/python3.5/site-packages/rest_framework/generics.py", line 151, in filter_queryset queryset = backend().filter_queryset(self.request, queryset, self) attributeerror: 'orderingfilter' object has no attribute 'filter_queryset'
going orderingfilter
, indeed not have filter_queryset
method, view expects it:
# in genericapiview(views.apiview) def filter_queryset(self, queryset): """ given queryset, filter whichever filter backend in use. unlikely want override method, although may need call either list view, or custom `get_object` method if want apply configured filtering backend default queryset. """ backend in list(self.filter_backends): queryset = backend().filter_queryset(self.request, queryset, self) return queryset
i have tried various solutions in django rest framework queryset doesn't order, seems not work, either. tried updating promising answer:
class your_view_set(viewsets.modelviewset): #your code here ordering_filter = orderingfilter() def filter_queryset(self, queryset): queryset = super(your_view_set, self).filter_queryset(queryset) return self.ordering_filter.filter_queryset(self.request, queryset, self)
since orderingfilter
not have filter_queryset
method, changed filter_queryset
filter
(which have), call seems clash signature of filter
in orderingfilter
:
# in orderingfilter(basecsvfilter, choicefilter) def filter(self, qs, value): if value in empty_values: return qs ordering = [self.get_ordering_value(param) param in value] return qs.order_by(*ordering)
i have no idea value
in function declaration supposed try pass function, seems qs
refers queryset, assume should first argument instead of second, again, not entirely sure value
be; doesn't seem request because not iterable.
i appreciate pointers or ideas, or workarounds, , apologize if missed obvious; not terribly familiar django.
just ran myself!
don't use class django_filters, use rest_framework.filters.orderingfilter
instead.
from rest_framework.filters import orderingfilter django_filters.rest_framework import djangofilterbackend, filterset ...
Comments
Post a Comment