Improve ModelSerializer.create() error message. (#6112)

This commit is contained in:
Oleg 2018-08-06 21:11:55 +03:00 committed by Carlton Gibson
parent 8b5e830bce
commit 2fab7838ef
2 changed files with 25 additions and 17 deletions

View File

@ -941,15 +941,17 @@ class ModelSerializer(Serializer):
except TypeError: except TypeError:
tb = traceback.format_exc() tb = traceback.format_exc()
msg = ( msg = (
'Got a `TypeError` when calling `%s._default_manager.create()`. ' 'Got a `TypeError` when calling `%s.%s.create()`. '
'This may be because you have a writable field on the ' 'This may be because you have a writable field on the '
'serializer class that is not a valid argument to ' 'serializer class that is not a valid argument to '
'`%s._default_manager.create()`. You may need to make the field ' '`%s.%s.create()`. You may need to make the field '
'read-only, or override the %s.create() method to handle ' 'read-only, or override the %s.create() method to handle '
'this correctly.\nOriginal exception was:\n %s' % 'this correctly.\nOriginal exception was:\n %s' %
( (
ModelClass.__name__, ModelClass.__name__,
ModelClass._default_manager.name,
ModelClass.__name__, ModelClass.__name__,
ModelClass._default_manager.name,
self.__class__.__name__, self.__class__.__name__,
tb tb
) )

View File

@ -102,13 +102,6 @@ class Issue3674ChildModel(models.Model):
value = models.CharField(primary_key=True, max_length=64) value = models.CharField(primary_key=True, max_length=64)
class Issue6110TestModel(models.Model):
"""Model without .objects manager."""
name = models.CharField(max_length=64)
all_objects = models.Manager()
class UniqueChoiceModel(models.Model): class UniqueChoiceModel(models.Model):
CHOICES = ( CHOICES = (
('choice1', 'choice 1'), ('choice1', 'choice 1'),
@ -133,7 +126,7 @@ class TestModelSerializer(TestCase):
}) })
serializer.is_valid() serializer.is_valid()
msginitial = 'Got a `TypeError` when calling `OneFieldModel._default_manager.create()`.' msginitial = 'Got a `TypeError` when calling `OneFieldModel.objects.create()`.'
with self.assertRaisesMessage(TypeError, msginitial): with self.assertRaisesMessage(TypeError, msginitial):
serializer.save() serializer.save()
@ -1233,13 +1226,26 @@ class TestFieldSource(TestCase):
self.assertEqual(unicode_repr(TestSerializer()), expected) self.assertEqual(unicode_repr(TestSerializer()), expected)
class Issue6110Test(TestCase): class Issue6110TestModel(models.Model):
def test_model_serializer_custom_manager(self): """Model without .objects manager."""
class TestModelSerializer(serializers.ModelSerializer): name = models.CharField(max_length=64)
all_objects = models.Manager()
class Issue6110ModelSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Issue6110TestModel model = Issue6110TestModel
fields = ('name',) fields = ('name',)
instance = TestModelSerializer().create({'name': 'test_name'})
class Issue6110Test(TestCase):
def test_model_serializer_custom_manager(self):
instance = Issue6110ModelSerializer().create({'name': 'test_name'})
self.assertEqual(instance.name, 'test_name') self.assertEqual(instance.name, 'test_name')
def test_model_serializer_custom_manager_error_message(self):
msginitial = ('Got a `TypeError` when calling `Issue6110TestModel.all_objects.create()`.')
with self.assertRaisesMessage(TypeError, msginitial):
Issue6110ModelSerializer().create({'wrong_param': 'wrong_param'})