2017-12-17 4 views
0

매개 변수별로 유연한 정렬과 매개 변수 필터링을 모두 수행해야하는 뷰셋이 있는데 이는 사용자 지정 list() 오버 라이드입니다. django-filter을 통해 다양한 매개 변수를 필터링하고 작동하도록 명령을받을 수는 있지만 동시에 둘 다 작동하도록 할 수는 없습니다.Django Rest Framework : OrderingFilter와 django-filter를 동시에 사용하는 문제

class AssetViewSet(viewsets.GenericViewSet, AssetPaginationMixin,): 

    queryset = Asset.objects.all() 
    pagination_class = AssetPagination 
    serializer_class = serializers.AssetSerializer 
    filter_backends = (OrderingFilter,) 
    ordering_fields = ('id', 'session_id') 
    filter_class = AssetFilterSet 

    def list(self, request): 
     assets = AssetFilterSet(request.query_params) 
     serializer = self.get_serializer(assets, many=True) 
     return Response(serializer.data) 

그리고 마지막으로, 내 filters.py 코드 : 필터링 작동 코드 여기

class AssetViewSet(viewsets.GenericViewSet, AssetPaginationMixin,): 

    queryset = Asset.objects.all() 
    pagination_class = AssetPagination 
    serializer_class = serializers.AssetSerializer 
    filter_backends = (OrderingFilter,) 
    ordering_fields = ('id', 'session_id') 
    filter_class = AssetFilterSet 

    def list(self, request): 
     assets = self.filter_queryset(self.get_queryset()) 
     serializer = self.get_serializer(assets, many=True) 
     return Response(serializer.data) 

그리고있다 :

여기에 결과를 주문 작동 내 간단한 views.py 코드

class AssetFilterSet(django_filters.FilterSet): 
    project_id = django_filters.NumberFilter() 
    submitted = django_filters.TypedChoiceFilter(choices=BOOLEAN_CHOICES, coerce=strtobool) 
    class Meta: 
     model = Asset 
     fields = ['project', 
        'submitted'] 

유일한 차이점은 첫 번째 l in . 웬일인지 filter_class = AssetFilterSet으로 지정되어 있음에도 불구하고 에 self.filter_queryset을 사용하면 AssetFilterSet을 적용해야 효과가 나타나기 때문에 list() 내에 직접 적용해야합니다.

+0

모델을 사용하고 있기 때문에'viewset.ListViewSet' 또는'viewset.ModelViewSet'의 하위 클래스를 만들면 왜 상속 될 것이므로'list'를 제공 할 필요가 없습니다. –

답변

0

나는 내 자신의 질문에 대답 할 것이다. 매우 간단한 수정이라고 밝혀졌습니다. DjangoFilterBackendOrderingFilterfilter_backends으로 명시 적으로 포함해야합니다 (DjangoFilterBackend이 SETTINGS에 전체적으로 지정되어 있음).

class AssetViewSet(viewsets.GenericViewSet, AssetPaginationMixin,): 

    queryset = Asset.objects.all() 
    pagination_class = AssetPagination 
    serializer_class = serializers.AssetSerializer 
    filter_backends = (DjangoFilterBackend, OrderingFilter,) 
    ordering_fields = ('id', 'session_id') 
    filter_class = AssetFilterSet 

    def list(self, request): 
     assets = self.filter_queryset(self.get_queryset()) 
     serializer = self.get_serializer(assets, many=True) 
     return Response(serializer.data) 

내가 인상이었다 설정에 DjangoFilterBackend를 지정하면이 기본적으로 포함된다과 filter_backends 필터를 추가하는 것은 그것을 대체하지, 여기에 추가 할 것을 의미하는 것이 :

여기 작업 코드입니다. 라이브로 배우십시오!