Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to show query parameter options in Django REST Framework - Swagger

This has been bugging me for a while now.

My ultimate goal is to show query parameter options inside SwaggerUI and give a form input for each query parameter. Similar to how it is displayed when providing a serializer for POST.

I am using a viewset which inherits from GenericViewSet and I have tried the following:

  • provide filter_fields attribute
  • provide and set filter_backends attribute to (filters.DjangoFilterBackend,)
  • provide filter_class defined inside my module.
  • Override options method to provide [actions][GET] information

Here's a small catch, I am not using any models so I don't think DjangoFilterBackend will really help me. I am using DjangoRESTFramework to talk to an outside API, and I am simply getting JSON result back, and passing it through to the frontend layer.

Here is a small modified snippet of my code to better explain my problem:

views.py

class SomeViewSet(GenericViewSet):     # Note that I have all of these defined, but I have tried various combinations     filter_fields = ('query_option_1', 'query_option_2',)     filter_backeds = (filters.DjangoFilterBackend,)     filter_class = SomeFilter     query_metadata = some_dict      # This works when request is OPTIONS     def options(self, request, *args, **kwargs):         if self.metadata_class is None:             return self.http_method_not_allowed(request, *args, **kwargs)         data = self.metadata_class().determine_metadata(request, self)         data['actions']['GET'] = self.query_metadata         return Response(data, status=status.HTTP_200_OK) 

filters.py

class SomeFilter(FilterSet):     strict = True     query_option_1 = django_filters.NumberFilter(name='query_option_1')     query_option_2 = django_filters.NumberFilter(name='query_option_2')      class Meta:         fields = ['query_option_1', 'query_option_2'] 

Thank you for looking, and thanks in advance for responding.

like image 522
dajee Avatar asked Jan 28 '15 21:01

dajee


People also ask

Can I use swagger with Django?

Improved performance. Allow multiple instances of Swagger UI in a single Django project. Allow rendering the OpenAPI JSON spec independently. Improved control of authentication mechanisms.

How do I get all query parameters in Django?

We can access the query params from the request in Django from the GET attribute of the request. To get the first or only value in a parameter simply use the get() method. To get the list of all values in a parameter use getlist() method.

Is Django REST swagger deprecated?

Django REST Swagger: deprecated (2019-06-04) This project is no longer being maintained.


Video Answer


2 Answers

New swagger

from rest_framework.filters import BaseFilterBackend import coreapi  class SimpleFilterBackend(BaseFilterBackend):     def get_schema_fields(self, view):         return [coreapi.Field(             name='query',             location='query',             required=False,             type='string'         )]  class MyViewSet(viewsets.ViewSet):     filter_backends = (SimpleFilterBackend,)      def list(self, request, *args, **kwargs):         # print(request.GET.get('query'))  # Use the query param in your view         return Response({'hello': 'world'}, status.HTTP_200_OK) 
like image 136
vadimchin Avatar answered Sep 20 '22 12:09

vadimchin


Okay, for those who stumble upon this question, I have figured it out. It is rather silly, and I feel a little stupid for not knowing, but in my defense, it was not clearly documented. The information was not found in DRF documentation, or inside Django REST Swagger repository. Instead it was found under django-rest-framework-docs, which is what Django REST Swagger is built off of.

To specify your query parameter to show up in your SwaggerUI as a form field, you simply comment like so:

def list(self):     """     param1 -- A first parameter     param2 -- A second parameter     """      ... 

And swagger will parse your comments and will put a form input for param1 and param2. What follows -- are the descriptions for the parameters.

like image 35
dajee Avatar answered Sep 18 '22 12:09

dajee