Fixed #3751 -- Stopped listing related field choices through metadata.

Listing related fields can leak sensitive data and result in poor performance
when dealing with large result sets.

Large result sets should be exposed by a dedicated endpoint instead.
This commit is contained in:
Simon Charette 2016-03-29 13:25:26 -04:00
parent 6b1125a2b6
commit a6732e25ec
2 changed files with 17 additions and 2 deletions

View File

@ -137,7 +137,9 @@ class SimpleMetadata(BaseMetadata):
elif getattr(field, 'fields', None):
field_info['children'] = self.get_serializer_info(field)
if not field_info.get('read_only') and hasattr(field, 'choices'):
if (not field_info.get('read_only') and
not isinstance(field, serializers.RelatedField) and
hasattr(field, 'choices')):
field_info['choices'] = [
{
'value': choice_value,

View File

@ -11,6 +11,8 @@ from rest_framework.renderers import BrowsableAPIRenderer
from rest_framework.request import Request
from rest_framework.test import APIRequestFactory
from .models import BasicModel
request = Request(APIRequestFactory().options('/'))
@ -261,10 +263,21 @@ class TestMetadata:
view = ExampleView.as_view(versioning_class=scheme)
view(request=request)
class TestSimpleMetadataFieldInfo(TestCase):
def test_null_boolean_field_info_type(self):
options = metadata.SimpleMetadata()
field_info = options.get_field_info(serializers.NullBooleanField())
assert field_info['type'] == 'boolean'
self.assertEqual(field_info['type'], 'boolean')
def test_related_field_choices(self):
options = metadata.SimpleMetadata()
BasicModel.objects.create()
with self.assertNumQueries(0):
field_info = options.get_field_info(
serializers.RelatedField(queryset=BasicModel.objects.all())
)
self.assertNotIn('choices', field_info)
class TestModelSerializerMetadata(TestCase):