Raise error when ModelSerializer used with abstract model

This commit is contained in:
Ilias Kiourktsidis 2015-03-23 15:01:19 +00:00
parent c9618cc0f3
commit 486f0a9367
3 changed files with 35 additions and 0 deletions

View File

@ -823,6 +823,10 @@ class ModelSerializer(Serializer):
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')

View File

@ -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

View File

@ -94,6 +94,30 @@ class TestModelSerializer(TestCase):
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):