2015-01-28 11 views
12

Questo mi ha infastidito da un po 'di tempo.Come mostrare le opzioni dei parametri di query in Django REST Framework - Swagger

Il mio obiettivo finale è mostrare le opzioni dei parametri di query all'interno di SwaggerUI e fornire un input di modulo per ciascun parametro di query. Simile a come viene visualizzato quando si fornisce un serializzatore per POST.

Sto usando un viewset che eredita da GenericViewSet e ho provato quanto segue:

  • forniscono filter_fields attributo
  • fornire e impostare l'attributo filter_backends-(filters.DjangoFilterBackend,)
  • fornire filter_class definito dentro il mio modulo.
  • Override options metodo per fornire informazioni [actions][GET]

Ecco un piccolo cattura, non sto usando tutti i modelli in modo da non penso DjangoFilterBackend sarà davvero aiutarmi. Sto usando DjangoRESTFramework per parlare con un'API esterna e sto semplicemente recuperando i risultati JSON e passando attraverso il livello frontend.

Ecco un piccolo frammento modificato del mio codice per spiegare meglio il mio problema:

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'] 

Grazie per lo sguardo, e grazie in anticipo per rispondere.

risposta

19

Ok, per coloro che incappano in questa domanda, l'ho capito. È piuttosto sciocco, e mi sento un po 'stupido per non sapere, ma a mia difesa, non è stato chiaramente documentato. Le informazioni non sono state trovate nella documentazione DRF o all'interno del repository Swaga di Django REST. Invece è stato trovato sotto django-rest-framework-docs, che è ciò che è stato creato da Django REST Swagger.

per specificare il parametro di query di presentarsi nelle vostre SwaggerUI come un campo di modulo, è sufficiente commentare in questo modo:

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

E spavalderia analizzerà i tuoi commenti e metterà un modulo di input per param1 e param2. Quello che segue -- sono le descrizioni dei parametri.

+3

ho provato la soluzione, ma i parametri di query non appaiono né per la documentazione delle API HTML di default, né per [* rest_framework_swagger *] (https://github.com/marcgibbons/django-rest-swagger/). – JJD

+2

** NOTE ** Funziona per swagger ma non per rest_framework_docs – dnit13

+0

@ dnit13 C'è un supporto per il markdown nei documenti DRF, ma non ancora rilasciato, pepole può ancora usarlo con un template personalizzato templatetag e un override del template. https://github.com/manosim/django-rest-framework-docs/pull/127/files#diff-22988fe5403ab4a34d522ff6fb4bb436 –

11

Ho trovato il rest framework swagger docs. così possiamo scrivere il tipo di parametro (interger, char), risposta, ecc.

il tripple --- è necessario.

@api_view(["POST"]) 
def foo_view(request): 
    """ 
    Your docs 
    --- 
    # YAML (must be separated by `---`) 

    type: 
     name: 
     required: true 
     type: string 
     url: 
     required: false 
     type: url 
     created_at: 
     required: true 
     type: string 
     format: date-time 

    serializer: .serializers.FooSerializer 
    omit_serializer: false 

    parameters_strategy: merge 
    omit_parameters: 
     - path 
    parameters: 
     - name: name 
      description: Foobar long description goes here 
      required: true 
      type: string 
      paramType: form 
     - name: other_foo 
      paramType: query 
     - name: other_bar 
      paramType: query 
     - name: avatar 
      type: file 

    responseMessages: 
     - code: 401 
      message: Not authenticated 
    """ 

Come per la situazione usiamo la classe mixins come ModelViewSets. Abbiamo bisogno di definire la funzione list solo per aggiungere i documenti? - No

possiamo fare in questo modo:

class ArticleViewSet(viewsets.ModelViewSet): 

    """ 
    Articles. 
    --- 
    list: #<--- here!! 
     parameters: 
      - name: name 
       description: article title 
    get_price: 
     omit_serializer: true 

    """ 

    @list_route(methods=['get']) 
    def get_price(self, request): 
     pass 
+0

FYI, c'è un bug in django-rest-swagger == 0.3.4, controlla https://github.com/marcgibbons/django-rest-swagger/issues/303. dovresti sostituire 'list' con i nomi dei metodi HTTP come' GET' nel tuo esempio. –

+0

YAML in docstrings è stato deprecato –

14

Nuova spavalderia

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): 
     return Response({'hello': 'world'}, status.HTTP_200_OK) 
+2

In Django rest swagger 2 questa è la risposta pertinente, poiché le docstring sono deprecate. – Erika

+5

Gaaahhh !!! Tutto continua a cambiare, e i documenti sono spazzatura. –

+1

Ho dovuto aggiungere un metodo 'filter_queryset (self, request, queryset, view)' che non fa nulla perché il 'BaseFilterBackend' genererà' NotImplementedError' quando tenta di filtrare il queryset. – jarussi

Problemi correlati