aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--rest_framework/serializers.py6
-rw-r--r--tests/test_serializer_metaclass.py62
2 files changed, 68 insertions, 0 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index c022cad3..8784b303 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -794,6 +794,12 @@ class ModelSerializer(Serializer):
depth = getattr(self.Meta, 'depth', 0)
extra_kwargs = getattr(self.Meta, 'extra_kwargs', {})
+ if fields and not isinstance(fields, (list, tuple)):
+ raise TypeError('`fields` must be a list or tuple')
+
+ if exclude and not isinstance(exclude, (list, tuple)):
+ raise TypeError('`exclude` must be a list or tuple')
+
assert not (fields and exclude), "Cannot set both 'fields' and 'exclude'."
extra_kwargs = self._include_additional_options(extra_kwargs)
diff --git a/tests/test_serializer_metaclass.py b/tests/test_serializer_metaclass.py
new file mode 100644
index 00000000..bd2fbed7
--- /dev/null
+++ b/tests/test_serializer_metaclass.py
@@ -0,0 +1,62 @@
+from django.test import TestCase
+from rest_framework import serializers
+from .models import BasicModel
+
+
+class TestSerializerMetaClass(TestCase):
+ def setUp(self):
+ class FieldsSerializer(serializers.ModelSerializer):
+ text = serializers.CharField()
+
+ class Meta:
+ model = BasicModel
+ fields = ('text')
+
+ class ExcludeSerializer(serializers.ModelSerializer):
+ text = serializers.CharField()
+
+ class Meta:
+ model = BasicModel
+ exclude = ('text')
+
+ class FieldsAndExcludeSerializer(serializers.ModelSerializer):
+ text = serializers.CharField()
+
+ class Meta:
+ model = BasicModel
+ fields = ('text',)
+ exclude = ('text',)
+
+ self.fields_serializer = FieldsSerializer
+ self.exclude_serializer = ExcludeSerializer
+ self.faeSerializer = FieldsAndExcludeSerializer
+
+ def test_meta_class_fields(self):
+ object = BasicModel(text="Hello World.")
+ serializer = self.fields_serializer(instance=object)
+
+ with self.assertRaises(TypeError) as result:
+ serializer.data
+
+ exception = result.exception
+ self.assertEqual(str(exception), "`fields` must be a list or tuple")
+
+ def test_meta_class_exclude(self):
+ object = BasicModel(text="Hello World.")
+ serializer = self.exclude_serializer(instance=object)
+
+ with self.assertRaises(TypeError) as result:
+ serializer.data
+
+ exception = result.exception
+ self.assertEqual(str(exception), "`exclude` must be a list or tuple")
+
+ def test_meta_class_fields_and_exclude(self):
+ object = BasicModel(text="Hello World.")
+ serializer = self.faeSerializer(instance=object)
+
+ with self.assertRaises(AssertionError) as result:
+ serializer.data
+
+ exception = result.exception
+ self.assertEqual(str(exception), "Cannot set both 'fields' and 'exclude'.")