mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-11-04 01:47:59 +03:00 
			
		
		
		
	Improve ModelSerializer.create() error message. (#6112)
This commit is contained in:
		
							parent
							
								
									8b5e830bce
								
							
						
					
					
						commit
						2fab7838ef
					
				| 
						 | 
				
			
			@ -941,15 +941,17 @@ class ModelSerializer(Serializer):
 | 
			
		|||
        except TypeError:
 | 
			
		||||
            tb = traceback.format_exc()
 | 
			
		||||
            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 '
 | 
			
		||||
                '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 '
 | 
			
		||||
                'this correctly.\nOriginal exception was:\n %s' %
 | 
			
		||||
                (
 | 
			
		||||
                    ModelClass.__name__,
 | 
			
		||||
                    ModelClass._default_manager.name,
 | 
			
		||||
                    ModelClass.__name__,
 | 
			
		||||
                    ModelClass._default_manager.name,
 | 
			
		||||
                    self.__class__.__name__,
 | 
			
		||||
                    tb
 | 
			
		||||
                )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -102,13 +102,6 @@ class Issue3674ChildModel(models.Model):
 | 
			
		|||
    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):
 | 
			
		||||
    CHOICES = (
 | 
			
		||||
        ('choice1', 'choice 1'),
 | 
			
		||||
| 
						 | 
				
			
			@ -133,7 +126,7 @@ class TestModelSerializer(TestCase):
 | 
			
		|||
        })
 | 
			
		||||
        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):
 | 
			
		||||
            serializer.save()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1233,13 +1226,26 @@ class TestFieldSource(TestCase):
 | 
			
		|||
        self.assertEqual(unicode_repr(TestSerializer()), expected)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Issue6110TestModel(models.Model):
 | 
			
		||||
    """Model without .objects manager."""
 | 
			
		||||
 | 
			
		||||
    name = models.CharField(max_length=64)
 | 
			
		||||
    all_objects = models.Manager()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Issue6110ModelSerializer(serializers.ModelSerializer):
 | 
			
		||||
    class Meta:
 | 
			
		||||
        model = Issue6110TestModel
 | 
			
		||||
        fields = ('name',)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Issue6110Test(TestCase):
 | 
			
		||||
 | 
			
		||||
    def test_model_serializer_custom_manager(self):
 | 
			
		||||
 | 
			
		||||
        class TestModelSerializer(serializers.ModelSerializer):
 | 
			
		||||
            class Meta:
 | 
			
		||||
                model = Issue6110TestModel
 | 
			
		||||
                fields = ('name',)
 | 
			
		||||
 | 
			
		||||
        instance = TestModelSerializer().create({'name': 'test_name'})
 | 
			
		||||
        instance = Issue6110ModelSerializer().create({'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'})
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user