Update extra_kwargs on model serializer

Ensures that the 'read_only' and 'required' keys from `extra_kwargs` are
retained when present. Closes #3091.
This commit is contained in:
Tyler Redzko 2015-07-01 10:10:18 -04:00
parent 5bb02cc7b9
commit af08c70242
2 changed files with 19 additions and 2 deletions

View File

@ -1105,8 +1105,8 @@ class ModelSerializer(Serializer):
if extra_kwargs.get('default') and kwargs.get('required') is False: if extra_kwargs.get('default') and kwargs.get('required') is False:
kwargs.pop('required') kwargs.pop('required')
if kwargs.get('read_only', False): if extra_kwargs.get('read_only', kwargs.get('read_only', False)):
extra_kwargs.pop('required', None) extra_kwargs.pop('required', None) # Read only fields should always omit the 'required' argument.
kwargs.update(extra_kwargs) kwargs.update(extra_kwargs)

View File

@ -235,6 +235,23 @@ class TestRegularFieldMappings(TestCase):
""") """)
self.assertEqual(repr(TestSerializer()), expected) self.assertEqual(repr(TestSerializer()), expected)
def test_extra_field_kwargs_required(self):
"""
Ensure `extra_kwargs` are passed to generated fields.
"""
class TestSerializer(serializers.ModelSerializer):
class Meta:
model = RegularFieldsModel
fields = ('auto_field', 'char_field')
extra_kwargs = {'auto_field': {'required': False, 'read_only': False}}
expected = dedent("""
TestSerializer():
auto_field = IntegerField(read_only=False, required=False)
char_field = CharField(max_length=100)
""")
self.assertEqual(repr(TestSerializer()), expected)
def test_invalid_field(self): def test_invalid_field(self):
""" """
Field names that do not map to a model field or relationship should Field names that do not map to a model field or relationship should