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.
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
Siehe mein Update oben. –