2013-02-27 15 views

Antwort

6

Sie können OPTIONS zurückgeben, was auch immer Sie wollen, indem Sie die .metadata() Methode in der Ansicht überschreiben.

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


-Update ab 2015: Wir haben jetzt eine anpassbare Metadaten-API, die dies einfacher macht: http://www.django-rest-framework.org/api-guide/metadata/

+0

Können Sie PLZ besser erklären, wie kann ich .metadata() überschauen? Dieser Link zeigt auf 'Linie 340', aber ich weiß nicht, welche Methode Sie beziehen. – ePascoal

+1

Siehe mein Update oben. –

0

Sie können völlig dies tun. Hier ist eine custom metadata class, die ich hier auf StackOverflow auf dem neuesten Stand gehalten habe. Dies listet einfach alle verfügbaren Filter, ihre Typen und ihre Auswahl auf. Es listet auch die Bestellfelder, die auf einer Klasse zur Verfügung stehen:

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, die irgendwo in Ihrem Projekt, dann DEFAULT_METADATA_CLASS gesetzt, und Sie sollen alle gesetzt, mit einem neuen Schlüssel auf Ihren OPTIONS Anfragen wie so sein:

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

Dies wird choices auch zeigen den Weg Spiegelung es an anderer Stelle in DRF behandelt wird.

Verwandte Themen