2017-03-08 7 views
3

@list_routeにフィルタを使用する方法は、DRFのルートビューセットと同じ方法ですか?drfでlist_routesでフィルタを使用する

私は用のフィルタを設定したモデルと、私はできません詳細ルートがあります。

class ListingViewSet(viewsets.ModelViewSet): 
    # disable listing after 5 flags 
    queryset = Listing.objects.all() 

    serializer_class = ListingSerializer 
    filter_backends = (DjangoFilterBackend, OrderingFilter, SearchFilter) 
    permission_classes = (ListingOwnerCanEdit,) 
    filter_class = ListingFilter 

    @list_route() 
    def homepage(self, request): 
     queryset = Listing.objects.filter(flags__lt=5, closed=False) 

     ### Doesn't work 
     # filter_backends = (DjangoFilterBackend, OrderingFilter, SearchFilter) 
     # permission_classes = (ListingOwnerCanEdit,) 
     # filter_class = ListingFilter 
     # ordering_filter = OrderingFilter() 
     # ordering_fields = ('price', 'views') 
     # search_fields = ('title', 'description') 

     serializer = ListingSerializer(queryset, many=True, context=self.get_serializer_context()) 
     return Response(serializer.data) 

そしてListingFilterは次のとおりです。

class ListingFilter(django_filters.rest_framework.FilterSet): 
    min_price = django_filters.NumberFilter(name="price", lookup_expr='gte') 
    max_price = django_filters.NumberFilter(name="price", lookup_expr='lte') 
    author_pk = django_filters.CharFilter(name='author_pk') 

    class Meta: 
     model = Listing 
     fields = ['price_type', 'sale_type', 'category__name', 'min_price', 'max_price', 'description', 'title', 
       'listing_date', 'views', 'number_of_inquiries', 'author_pk', 'closed', 'closing_date'] 

ホームページでListingFilterを使用する方法はありますリストルート?

答えて

6

あなたは@list_routeで飾られ、あなたの方法でfilter_querysetを呼び出す必要があります:

@list_route() 
def homepage(self, request): 
    queryset = self.get_queryset().filter(flags__lt=5, closed=False) 
    queryset = self.filter_queryset(queryset) 

    serializer = ListingSerializer(queryset, many=True, context=self.get_serializer_context()) 
    return Response(serializer.data) 

編集:それもself.get_queryset()の代わりListing.objectsを使用することをお勧めします。

関連する問題