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:
filter_fields
attribute filter_backends
attribute to (filters.DjangoFilterBackend,)
options
method to provide [actions][GET]
informationHere'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.
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.
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.
Django REST Swagger: deprecated (2019-06-04) This project is no longer being maintained.
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)
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With