Я пытаюсь заставить OrderingFilter работать. Из примера на странице django-rest-framework кажется, что это должно быть довольно просто:
class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = (filters.OrderingFilter,)
ordering_fields = ('username', 'email')
Однако, когда я пытаюсь это сделать:
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',)
Я получаю сообщение об ошибке, когда OrderingFilter
не имеет атрибута filter_queryset
:
ERROR 2016-11-13 03:14:57,304 log 25913 123145338523648 (<class 'AttributeError'>, AttributeError("'OrderingFilter' object has no attribute 'filter_queryset'",), <traceback object at 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'
Переходя в OrderingFilter
, он действительно не имеет метода filter_queryset
, но представление ожидает его:
# in GenericAPIView(views.APIView)
def filter_queryset(self, queryset):
"""
Given a queryset, filter it with whichever filter backend is in use.
You are unlikely to want to override this method, although you may need
to call it either from a list view, or from a custom 'get_object'
method if you want to apply the configured filtering backend to the
default queryset.
"""
for backend in list(self.filter_backends):
queryset = backend().filter_queryset(self.request, queryset, self)
return queryset
Я пробовал различные решения в django rest framework queryset не упорядочивает, но, похоже, они тоже не работают. Я попробовал обновить наиболее перспективный ответ:
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)
Так как OrderingFilter
не имеет метода filter_queryset
, я изменил filter_queryset
на filter
(который у него есть), но этот вызов, похоже, сталкивается с сигнатурой filter
в OrderingFilter
:
# In OrderingFilter(BaseCSVFilter, ChoiceFilter)
def filter(self, qs, value):
if value in EMPTY_VALUES:
return qs
ordering = [self.get_ordering_value(param) for param in value]
return qs.order_by(*ordering)
Я не знаю, какое value
в объявлении функции должно быть таким, чтобы я мог попытаться передать его функции, но, похоже, qs
ссылается на набор запросов, поэтому я предполагаю, что это должен быть первый аргумент вместо второго, но снова, Я не совсем уверен, какая value
будет; он не кажется запросом, потому что он не является итерируемым.
Я был бы признателен за любые указатели или идеи или обходные пути, и я прошу прощения, если я пропустил что-то очевидное; Я не очень хорошо знаком с Django.