Skip to content

Commit c611a2c

Browse files
committed
Merge pull request #2213 from BrickXu/master
Raise error if `fields` on serializer is not a list of strings.
2 parents fca9175 + d68c614 commit c611a2c

File tree

2 files changed

+68
-0
lines changed

2 files changed

+68
-0
lines changed

rest_framework/serializers.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,12 @@ def get_fields(self):
794794
depth = getattr(self.Meta, 'depth', 0)
795795
extra_kwargs = getattr(self.Meta, 'extra_kwargs', {})
796796

797+
if fields and not isinstance(fields, (list, tuple)):
798+
raise TypeError('`fields` must be a list or tuple')
799+
800+
if exclude and not isinstance(exclude, (list, tuple)):
801+
raise TypeError('`exclude` must be a list or tuple')
802+
797803
assert not (fields and exclude), "Cannot set both 'fields' and 'exclude'."
798804

799805
extra_kwargs = self._include_additional_options(extra_kwargs)

tests/test_serializer_metaclass.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
from django.test import TestCase
2+
from rest_framework import serializers
3+
from .models import BasicModel
4+
5+
6+
class TestSerializerMetaClass(TestCase):
7+
def setUp(self):
8+
class FieldsSerializer(serializers.ModelSerializer):
9+
text = serializers.CharField()
10+
11+
class Meta:
12+
model = BasicModel
13+
fields = ('text')
14+
15+
class ExcludeSerializer(serializers.ModelSerializer):
16+
text = serializers.CharField()
17+
18+
class Meta:
19+
model = BasicModel
20+
exclude = ('text')
21+
22+
class FieldsAndExcludeSerializer(serializers.ModelSerializer):
23+
text = serializers.CharField()
24+
25+
class Meta:
26+
model = BasicModel
27+
fields = ('text',)
28+
exclude = ('text',)
29+
30+
self.fields_serializer = FieldsSerializer
31+
self.exclude_serializer = ExcludeSerializer
32+
self.faeSerializer = FieldsAndExcludeSerializer
33+
34+
def test_meta_class_fields(self):
35+
object = BasicModel(text="Hello World.")
36+
serializer = self.fields_serializer(instance=object)
37+
38+
with self.assertRaises(TypeError) as result:
39+
serializer.data
40+
41+
exception = result.exception
42+
self.assertEqual(str(exception), "`fields` must be a list or tuple")
43+
44+
def test_meta_class_exclude(self):
45+
object = BasicModel(text="Hello World.")
46+
serializer = self.exclude_serializer(instance=object)
47+
48+
with self.assertRaises(TypeError) as result:
49+
serializer.data
50+
51+
exception = result.exception
52+
self.assertEqual(str(exception), "`exclude` must be a list or tuple")
53+
54+
def test_meta_class_fields_and_exclude(self):
55+
object = BasicModel(text="Hello World.")
56+
serializer = self.faeSerializer(instance=object)
57+
58+
with self.assertRaises(AssertionError) as result:
59+
serializer.data
60+
61+
exception = result.exception
62+
self.assertEqual(str(exception), "Cannot set both 'fields' and 'exclude'.")

0 commit comments

Comments
 (0)