From a3df1c119967e04fd57495ebbb4645b02883fc4e Mon Sep 17 00:00:00 2001 From: Ryan P Kilby Date: Mon, 20 Nov 2017 03:51:16 -0500 Subject: [PATCH] Test Serializer exclude for declared fields (#5599) * Test current behavior of exclude+declared field * Assert declared fields are not present in exclude --- rest_framework/serializers.py | 11 +++++++++++ tests/test_model_serializer.py | 16 ++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 994d0273f..0952e190c 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -1102,6 +1102,17 @@ class ModelSerializer(Serializer): if exclude is not None: # If `Meta.exclude` is included, then remove those fields. for field_name in exclude: + assert field_name not in self._declared_fields, ( + "Cannot both declare the field '{field_name}' and include " + "it in the {serializer_class} 'exclude' option. Remove the " + "field or, if inherited from a parent serializer, disable " + "with `{field_name} = None`." + .format( + field_name=field_name, + serializer_class=self.__class__.__name__ + ) + ) + assert field_name in fields, ( "The field '{field_name}' was included on serializer " "{serializer_class} in the 'exclude' option, but does " diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py index 203e1fe7f..98586b971 100644 --- a/tests/test_model_serializer.py +++ b/tests/test_model_serializer.py @@ -900,6 +900,22 @@ class TestSerializerMetaClass(TestCase): "Cannot set both 'fields' and 'exclude' options on serializer ExampleSerializer." ) + def test_declared_fields_with_exclude_option(self): + class ExampleSerializer(serializers.ModelSerializer): + text = serializers.CharField() + + class Meta: + model = MetaClassTestModel + exclude = ('text',) + + expected = ( + "Cannot both declare the field 'text' and include it in the " + "ExampleSerializer 'exclude' option. Remove the field or, if " + "inherited from a parent serializer, disable with `text = None`." + ) + with self.assertRaisesMessage(AssertionError, expected): + ExampleSerializer().fields + class Issue2704TestCase(TestCase): def test_queryset_all(self):