python - ejemplo - django rest framework post



OrderingFilter no tiene el atributo 'filter_queryset' (1)

He estado tratando de hacer que OrderingFilter funcione. Del ejemplo en la página de django-rest-framework, parece que debería ser bastante sencillo:

class UserListView(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    filter_backends = (filters.OrderingFilter,)
    ordering_fields = ('username', 'email')

Sin embargo, cuando trato de hacer eso:

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',)

filter_queryset un error sobre OrderingFilter no tiene un atributo 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'

Al entrar en OrderingFilter , de hecho no tiene un método filter_queryset , pero la vista lo espera:

# 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

He intentado varias soluciones en el framework de descanso django. Queryset no ordena , pero parece que tampoco funcionan. Traté de actualizar la respuesta más prometedora:

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)

Como OrderingFilter no tiene un método filter_queryset , cambié filter_queryset para filter (que sí tiene), pero esta llamada parece entrar en conflicto con la firma del filter en 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)

No tengo idea de qué value se supone que debe ser la declaración de función, así que podría intentar pasarla a la función, pero parece qs refiere al conjunto de interrogación, así que supongo que debería ser el primer argumento en lugar del segundo, pero de nuevo , No estoy del todo seguro de qué value sería; no parece ser una solicitud porque no es iterable.

Agradecería cualquier sugerencia o ideas, o soluciones, y me disculpo si me perdí algo obvio; No estoy terriblemente familiarizado con Django.


Answer #1

¡Solo me encontré con esto!

No use la clase de django_filters, use rest_framework.filters.OrderingFilter en rest_framework.filters.OrderingFilter lugar.

from rest_framework.filters import OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend, FilterSet
...