2013-02-27 7 views
6

J'utilise le Django Rest Framework J'ai remarqué sur la partie navigable web de l'API il y a un bouton appelé 'options' quand on clique dessus il montre les éléments suivants ...Afficher les filtres et les commandes dans Django Rest Cadre Options Demande

HTTP 200 OK Vary: Accept Content-Type: text/html Allow: HEAD, GET, OPTIONS 
{ 
    "parses": [ 
     "application/json", 
     "application/x-www-form-urlencoded", 
     "multipart/form-data" 
    ], 
    "renders": [ 
     "application/json", 
     "text/html" 
    ], 
    "name": "Products", 
    "description": "API endpoint." 
} 

ma question est, est-il de toute façon je pourrais énumérer ici toutes les options de filtre un autre truc pour cette URL?

Répondre

6

Vous pouvez renvoyer OPTIONS comme vous le souhaitez, en remplaçant la méthode .metadata() dans la vue.

Voir ici: https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/views.py#L340


mise à jour à partir de 2015: Nous avons maintenant une API de métadonnées personnalisable qui rend cela plus facile: http://www.django-rest-framework.org/api-guide/metadata/

+0

Pouvez-vous mieux expliquer comment puis-je remplacer .metadata() sur la vue? ce lien pointe vers la 'ligne 340' mais je ne sais pas de quelle méthode vous parlez. – ePascoal

+1

Voir ma mise à jour ci-dessus. –

0

Vous pouvez tout à fait faire. Voici un custom metadata class que j'ai mis à jour ici sur StackOverflow. Cela liste simplement tous les filtres disponibles, leurs types et leurs choix. Il énumère également les champs de commande qui sont disponibles sur une classe:

class SimpleMetadataWithFilters(SimpleMetadata): 

    def determine_metadata(self, request, view): 
     metadata = super(SimpleMetadataWithFilters, self).determine_metadata(request, view) 
     filters = OrderedDict() 
     if not hasattr(view, 'filter_class'): 
      # This is the API Root, which is not filtered. 
      return metadata 

     for filter_name, filter_type in view.filter_class.base_filters.items(): 
      filter_parts = filter_name.split('__') 
      filter_name = filter_parts[0] 
      attrs = OrderedDict() 

      # Type 
      attrs['type'] = filter_type.__class__.__name__ 

      # Lookup fields 
      if len(filter_parts) > 1: 
       # Has a lookup type (__gt, __lt, etc.) 
       lookup_type = filter_parts[1] 
       if filters.get(filter_name) is not None: 
        # We've done a filter with this name previously, just 
        # append the value. 
        attrs['lookup_types'] = filters[filter_name]['lookup_types'] 
        attrs['lookup_types'].append(lookup_type) 
       else: 
        attrs['lookup_types'] = [lookup_type] 
      else: 
       # Exact match or RelatedFilter 
       if isinstance(filter_type, RelatedFilter): 
        model_name = (filter_type.filterset.Meta.model. 
            _meta.verbose_name_plural.title()) 
        attrs['lookup_types'] = "See available filters for '%s'" % \ 
              model_name 
       else: 
        attrs['lookup_types'] = ['exact'] 

      # Do choices 
      choices = filter_type.extra.get('choices', False) 
      if choices: 
       attrs['choices'] = [ 
        { 
         'value': choice_value, 
         'display_name': force_text(choice_name, strings_only=True) 
        } 
        for choice_value, choice_name in choices 
       ] 

      # Wrap up. 
      filters[filter_name] = attrs 

     metadata['filters'] = filters 

     if hasattr(view, 'ordering_fields'): 
      metadata['ordering'] = view.ordering_fields 
     return metadata 

Put que quelque part dans votre projet, puis définissez votre DEFAULT_METADATA_CLASS, et vous devriez être tous ensemble, avec une nouvelle clé sur vos OPTIONS demandes comme ceci:

"filters": { 
    "sub_opinions": { 
     "type": "RelatedFilter" 
    }, 
    "source": { 
     "type": "MultipleChoiceFilter", 
     "choices": [ 
      { 
       "display_name": "court website", 
       "value": "C" 
      }, 
     ] 
    } 
    ...more... 
} 

Cela permettra également afficher choices, à l'image de la façon dont il est traité ailleurs dans DRF.

Questions connexes