आप पूरी तरह से ऐसा कर सकते हैं: हम अब एक अनुकूलन मेटाडाटा एपीआई इस आसान बना देता है कि है। यहां एक custom metadata class है जिसे मैं यहां स्टैक ओवरफ्लो पर अद्यतित रख रहा हूं। यह बस सभी उपलब्ध फ़िल्टर, उनके प्रकार, और उनके विकल्पों की सूची देता है। यह भी आदेश देने के क्षेत्रों है कि एक वर्ग पर उपलब्ध हैं सूचीबद्ध करता है:
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
प्रदर्शित करते हैं, जिस तरह से यह डीआरएफ में कहीं संभाला है मिरर होगा।
क्या आप बेहतर व्याख्या कर सकते हैं कि मैं कैसे देख सकता हूं .metadata() को देखने पर? यह लिंक 'लाइन 340' पर इंगित करता है लेकिन मुझे नहीं पता कि आप किस विधि का संदर्भ लेते हैं। – ePascoal
ऊपर मेरा अपडेट देखें। –