我一直在努力让OrderingFilter人go 上班.从django-睡觉-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

I have tried the various solutions in django rest framework queryset doesn't order, but it seems they do not work, either. I tried updating the most 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)

由于OrderingFilter没有filter_queryset方法,我将filter_queryset更改为filter(它确实有),但此调用似乎与OrderingFilterfilter的签名冲突:

# 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应该是什么,所以我可以try 将其传递给函数,但似乎qs指的是queryset,所以我假设它应该是第一个参数,而不是第二个参数,但我也不完全确定value应该是什么;这似乎不是要求,因为它不可接受.

如果我错过了一些明显的东西,我将非常感激任何提示、 idea 或变通方法,如果我错过了一些明显的东西,我将深表歉意;我对Django并不是非常熟悉.

推荐答案

我自己也碰到了这个!

不要使用django_过滤器中的类,而是使用rest_framework.filters.OrderingFilter.

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

Django相关问答推荐

批量删除多对多条目?

Django模型ManyToManyField.Add不起作用

如何在Django上创建ManyToMany管理面板?

Django mods.py我想要一个函数转到一个变量

Django-admin 显示decorator 按多列排序

表单集中的每个表单验证

Django获取具有值的相关对象的计数并将其添加到注释中

包含资源时,DRF 返回我的软删除记录

未为部署的 django rest 框架加载静态文件

如果上下文中缺少变量,如何使 Django 模板引发错误

如何从 json 模式创建表单?

如何在 PyCharm 中重命名 Django 元素?

Django:get_or_create 使用 together_unique 引发重复条目

Django 1.9:字段与父模型中不存在的字段的字段冲突

如何使用自定义 AdminSite 类?

python/django中setattr和对象操作的区别

django sql 查询如何使用不区分大小写的同时包含?

如何在 django 2.0 admin 中使用 allow_tags?

它是如何工作的,Django INSTALLED_APPS 的命名约定?

确保只有一个工作人员在运行多个工作人员的 pyramid 网络应用程序中启动 apscheduler 事件