首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OrderingFilter没有属性“filter_queryset”

OrderingFilter没有属性“filter_queryset”
EN

Stack Overflow用户
提问于 2016-11-13 11:37:45
回答 1查看 11.6K关注 0票数 34

我一直在尝试让OrderingFilter正常工作。从django-rest-framework页面中的示例来看,似乎应该相当简单:

代码语言:javascript
运行
复制
class UserListView(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    filter_backends = (filters.OrderingFilter,)
    ordering_fields = ('username', 'email')

然而,当我尝试这样做的时候:

代码语言:javascript
运行
复制
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属性的错误:

代码语言:javascript
运行
复制
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方法,但视图需要它:

代码语言:javascript
运行
复制
# 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 doesn't order中的各种解决方案,但它们似乎也不起作用。我试着更新最有希望的答案:

代码语言:javascript
运行
复制
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 (它确实有),但此调用似乎与OrderingFilter中的filter签名冲突:

代码语言:javascript
运行
复制
# 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)

我不知道函数声明中的查询集应该是什么,所以我可以尝试将它传递给函数,但似乎qs引用了查询集,所以我假设应该是第一个参数,而不是第二个参数,但我也不完全确定value是什么;它似乎不是request,因为它是不可迭代的。

如果我错过了一些明显的东西,我将不胜感激。我对Django不是很熟悉。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-14 17:50:20

我自己也遇到了这个问题!

不要使用django_filters中的类,而要使用rest_framework.filters.OrderingFilter

代码语言:javascript
运行
复制
from rest_framework.filters import OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend, FilterSet
...
票数 105
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40570311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档