Skip to content

Commit 2394577

Browse files
committed
Merge pull request #2757 from ekiourk/2630/Raise-exception-when-ModelSerializer-used-with-abstract-model
Raise error when ModelSerializer used with abstract model
2 parents 2b6726e + 0888f9c commit 2394577

File tree

3 files changed

+35
-0
lines changed

3 files changed

+35
-0
lines changed

rest_framework/serializers.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,10 @@ def get_fields(self):
823823
serializer_class=self.__class__.__name__
824824
)
825825
)
826+
if model_meta.is_abstract_model(self.Meta.model):
827+
raise ValueError(
828+
'Cannot use ModelSerializer with Abstract Models.'
829+
)
826830

827831
declared_fields = copy.deepcopy(self._declared_fields)
828832
model = getattr(self.Meta, 'model')

rest_framework/utils/model_meta.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,3 +167,10 @@ def _merge_relationships(forward_relations, reverse_relations):
167167
list(forward_relations.items()) +
168168
list(reverse_relations.items())
169169
)
170+
171+
172+
def is_abstract_model(model):
173+
"""
174+
Given a model class, returns a boolean True if it is abstract and False if it is not.
175+
"""
176+
return hasattr(model, '_meta') and hasattr(model._meta, 'abstract') and model._meta.abstract

tests/test_model_serializer.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,30 @@ class Meta:
9494
msginitial = 'Got a `TypeError` when calling `OneFieldModel.objects.create()`.'
9595
assert str(excinfo.exception).startswith(msginitial)
9696

97+
def test_abstract_model(self):
98+
"""
99+
Test that trying to use ModelSerializer with Abstract Models
100+
throws a ValueError exception.
101+
"""
102+
class AbstractModel(models.Model):
103+
afield = models.CharField(max_length=255)
104+
105+
class Meta:
106+
abstract = True
107+
108+
class TestSerializer(serializers.ModelSerializer):
109+
class Meta:
110+
model = AbstractModel
111+
fields = ('afield',)
112+
113+
serializer = TestSerializer(data={
114+
'afield': 'foo',
115+
})
116+
with self.assertRaises(ValueError) as excinfo:
117+
serializer.is_valid()
118+
msginitial = 'Cannot use ModelSerializer with Abstract Models.'
119+
assert str(excinfo.exception).startswith(msginitial)
120+
97121

98122
class TestRegularFieldMappings(TestCase):
99123
def test_regular_fields(self):

0 commit comments

Comments
 (0)