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.
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
Yukarıdaki güncellemeye bakın. –