From af08c7024299e837a4b52edfd03f0d675f453a47 Mon Sep 17 00:00:00 2001 From: Tyler Redzko Date: Wed, 1 Jul 2015 10:10:18 -0400 Subject: [PATCH] Update extra_kwargs on model serializer Ensures that the 'read_only' and 'required' keys from `extra_kwargs` are retained when present. Closes #3091. --- rest_framework/serializers.py | 4 ++-- tests/test_model_serializer.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 3a452bcc1..7afddfd82 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -1105,8 +1105,8 @@ class ModelSerializer(Serializer): if extra_kwargs.get('default') and kwargs.get('required') is False: kwargs.pop('required') - if kwargs.get('read_only', False): - extra_kwargs.pop('required', None) + if extra_kwargs.get('read_only', kwargs.get('read_only', False)): + extra_kwargs.pop('required', None) # Read only fields should always omit the 'required' argument. kwargs.update(extra_kwargs) diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py index 28173b687..76c281fca 100644 --- a/tests/test_model_serializer.py +++ b/tests/test_model_serializer.py @@ -235,6 +235,23 @@ class TestRegularFieldMappings(TestCase): """) 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): """ Field names that do not map to a model field or relationship should