Skip to content

Commit

Permalink
Merge pull request #2757 from ekiourk/2630/Raise-exception-when-Model…
Browse files Browse the repository at this point in the history
…Serializer-used-with-abstract-model

Raise error when ModelSerializer used with abstract model
  • Loading branch information
tomchristie committed Apr 27, 2015
2 parents 2b6726e + 0888f9c commit 2394577
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 0 deletions.
4 changes: 4 additions & 0 deletions rest_framework/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -823,6 +823,10 @@ def get_fields(self):
serializer_class=self.__class__.__name__
)
)
if model_meta.is_abstract_model(self.Meta.model):
raise ValueError(
'Cannot use ModelSerializer with Abstract Models.'
)

declared_fields = copy.deepcopy(self._declared_fields)
model = getattr(self.Meta, 'model')
Expand Down
7 changes: 7 additions & 0 deletions rest_framework/utils/model_meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,3 +167,10 @@ def _merge_relationships(forward_relations, reverse_relations):
list(forward_relations.items()) +
list(reverse_relations.items())
)


def is_abstract_model(model):
"""
Given a model class, returns a boolean True if it is abstract and False if it is not.
"""
return hasattr(model, '_meta') and hasattr(model._meta, 'abstract') and model._meta.abstract
24 changes: 24 additions & 0 deletions tests/test_model_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,30 @@ class Meta:
msginitial = 'Got a `TypeError` when calling `OneFieldModel.objects.create()`.'
assert str(excinfo.exception).startswith(msginitial)

def test_abstract_model(self):
"""
Test that trying to use ModelSerializer with Abstract Models
throws a ValueError exception.
"""
class AbstractModel(models.Model):
afield = models.CharField(max_length=255)

class Meta:
abstract = True

class TestSerializer(serializers.ModelSerializer):
class Meta:
model = AbstractModel
fields = ('afield',)

serializer = TestSerializer(data={
'afield': 'foo',
})
with self.assertRaises(ValueError) as excinfo:
serializer.is_valid()
msginitial = 'Cannot use ModelSerializer with Abstract Models.'
assert str(excinfo.exception).startswith(msginitial)


class TestRegularFieldMappings(TestCase):
def test_regular_fields(self):
Expand Down

0 comments on commit 2394577

Please sign in to comment.