Как унаследовать общую фильтрацию в дополнительном действии

Я хочу наследовать Generic Filtering include (filterset_fields, search_fields, ordering_fields в дополнительном действии sold. Как это сделать, и какой способ лучше для этого случая? Спасибо за любой совет для меня!

class ApartmentViewset(viewsets.ModelViewSet):
    queryset = Apartment.objects.all().order_by('-timestamp')
    serializer_class = ApartmentSerializer
    # Set permission for only user owner apartment can edit it.
    permission_classes = [
        permissions.IsAuthenticatedOrReadOnly, IsOwnerApartmentOrReadOnly]
    # Add search by address, filter by district and ordering by price
    filter_backends = [filters.SearchFilter,
                       DjangoFilterBackend, filters.OrderingFilter]
    filterset_fields = ['district']
    search_fields = ['address', 'seller']
    ordering_fields = (
        'price',
    )

    # fill current username when create new apartment
    def perform_create(self, serializer):
        serializer.save(seller=self.request.user)

    @action(detail=False)
    def sold(self, request):
        queryset = self.queryset.filter(issold=True)
        serialize = self.serializer_class(queryset, many=True)
        return Response(serialize.data)

Generic View (и, следовательно, все классы, которые наследуются от него) в DRF имеет метод filter_queryset, который вызывается различными миксинами для выполнения фильтрации, поэтому вы можете просто вызвать его в своем методе. Если вам также нужна пагинация, существуют методы paginate_queryset и get_paginated_response:

class ApartmentViewset(viewsets.ModelViewSet):
    ...
    
    @action(detail=False)
    def sold(self, request):
        queryset = self.filter_queryset(self.queryset.filter(issold=True))
        serialize = self.serializer_class(queryset, many=True)
        return Response(serialize.data)
Вернуться на верх