8

私は Django Rest Framework を使用しています。API の Web ブラウズ可能な部分に「オプション」というボタンがあることに気付きました。クリックすると次のように表示されます...

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."
} 

私の質問は、とにかく、この URL のすべてのフィルター オプションと他のものをここにリストすることができるものはありますか?

4

2 に答える 2

8

ビューのメソッドをOPTIONSオーバーライドすることで、好きなように返すことができます。.metadata()

ここを参照してください: https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/views.py#L340


2015 年の更新: これを簡単にするカスタマイズ可能なメタデータ API が用意されました: http://www.django-rest-framework.org/api-guide/metadata/

于 2013-02-27T16:43:56.557 に答える
4

あなたは完全にこれを行うことができます。これは、StackOverflow で最新の状態に保っているカスタム メタデータ クラスです。これは、使用可能なすべてのフィルター、そのタイプ、およびその選択肢を単純にリストします。また、クラスで使用できる順序付けフィールドも示します。

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

それをプロジェクトのどこかに置いてから、を設定すると、次のようにリクエストDEFAULT_METADATA_CLASSに新しいキーを設定して、すべて設定する必要があります。OPTIONS

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

choicesこれは、DRF の他の場所で処理される方法を反映して、も表示されます。

于 2015-12-23T00:55:34.120 に答える