2013-02-27 16 views

cevap

6

Görünümde .metadata() yöntemini geçersiz kılarak, ne isterseniz OPTIONS dönüş yapabilirsiniz.

Buraya bakın: 2015 itibariyle https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/views.py#L340


Güncelleme: http://www.django-rest-framework.org/api-guide/metadata/

+0

Daha iyi açıklayabiliyor musun, nasıl daha iyi açıklayabilirim? Bu bağlantı '340 satırına işaret eder, ancak hangi yöntemi kullandığını bilmiyorum. – ePascoal

+1

Yukarıdaki güncellemeye bakın. –

0

Tamamen yapabilirsiniz: Biz şimdi bu kolaylaştıran özelleştirilebilir meta API vardır. İşte burada StackOverflow'ta güncel tuttuğum bir custom metadata class var. Bu sadece mevcut tüm filtreleri, türlerini ve seçimlerini listeler. Aynı zamanda bir sınıf mevcuttur sipariş alanları listeler: yere projenizde, sonra senin DEFAULT_METADATA_CLASS set

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 

koyun ve bunu gibi OPTIONS isteklerinde yeni bir anahtarla tüm set olmalıdır:

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

Bu aynı zamanda DRF başka yerlerinde işlenir oldu yolu yansıtma, choices gösterecektir.

İlgili konular