From edc05d0896431b3d664e54234923113662bb200b Mon Sep 17 00:00:00 2001 From: Ran Benita Date: Wed, 18 Dec 2019 11:02:59 +0200 Subject: [PATCH] Handle missing Meta properly --- rest_framework/serializers.py | 17 ++++++++++------- tests/test_model_serializer.py | 8 ++++++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 727fd37fd..f3a24da63 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -862,15 +862,13 @@ class ModelSerializerMetaclass(SerializerMetaclass): @classmethod def _get_fields(cls, new_class): - # XXX + # ModelSerializer itself and customized subclasses like + # HyperlinkedModelSerializer are never instantiated directly, + # and don't have a Meta. For these, the base_fields is None, + # and an error is raised if it's attempted to be used. if not hasattr(new_class, 'Meta'): - return OrderedDict() + return None - assert hasattr(new_class, 'Meta'), ( - 'Class {serializer_class} missing "Meta" attribute'.format( - serializer_class=new_class.__name__ - ) - ) assert hasattr(new_class.Meta, 'model'), ( 'Class {serializer_class} missing "Meta.model" attribute'.format( serializer_class=new_class.__name__ @@ -1097,6 +1095,11 @@ class ModelSerializer(Serializer, metaclass=ModelSerializerMetaclass): Return the dict of field names -> field instances that should be used for `self.fields` when instantiating the serializer. """ + assert self.base_fields is not None, ( + 'Class {serializer_class} missing "Meta" attribute'.format( + serializer_class=self.__class__.__name__ + ) + ) return copy.deepcopy(self.base_fields) # Methods for determining the set of field names to include... diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py index 852b5a180..87c218a70 100644 --- a/tests/test_model_serializer.py +++ b/tests/test_model_serializer.py @@ -151,6 +151,14 @@ class TestModelSerializer(TestCase): model = AbstractModel fields = ('afield',) + def test_missing_meta(self): + class TestSerializer(serializers.ModelSerializer): + text = serializers.CharField() + + msginitial = 'Class TestSerializer missing "Meta" attribute' + with self.assertRaisesMessage(AssertionError, msginitial): + TestSerializer().fields + class TestRegularFieldMappings(TestCase): def test_regular_fields(self):