mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-04 04:20:12 +03:00
Raise ValidationError on non-partial update if a field without a default value is not specified.
This commit is contained in:
parent
b150e5ddf6
commit
93573305ce
|
@ -354,7 +354,8 @@ class WritableField(Field):
|
||||||
else:
|
else:
|
||||||
native = self.default
|
native = self.default
|
||||||
else:
|
else:
|
||||||
if self.required:
|
incomplete_update = self.root.object is not None and not self.partial
|
||||||
|
if self.required or incomplete_update:
|
||||||
raise ValidationError(self.error_messages['required'])
|
raise ValidationError(self.error_messages['required'])
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
|
@ -921,15 +921,36 @@ class DefaultValueTests(TestCase):
|
||||||
serializer = self.serializer_class(instance=instance, data=data)
|
serializer = self.serializer_class(instance=instance, data=data)
|
||||||
self.assertFalse(serializer.is_valid())
|
self.assertFalse(serializer.is_valid())
|
||||||
|
|
||||||
# The field with a default value should be reset to default when omitted, and those
|
# Omitting an optional field with no default value is not valid
|
||||||
# without a default value should be set to None or a blank value when omitted.
|
data = {
|
||||||
data = {'required_field': 'required_field_updated'}
|
'text': 'text_updated',
|
||||||
|
'required_field': 'required_field_updated',
|
||||||
|
'extra': 'extra_updated',
|
||||||
|
}
|
||||||
|
serializer = self.serializer_class(instance=instance, data=data)
|
||||||
|
self.assertFalse(serializer.is_valid())
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'text': 'text_updated',
|
||||||
|
'required_field': 'required_field_updated',
|
||||||
|
'extra_not_nullable': 'extra_not_nullable_updated',
|
||||||
|
}
|
||||||
|
serializer = self.serializer_class(instance=instance, data=data)
|
||||||
|
self.assertFalse(serializer.is_valid())
|
||||||
|
|
||||||
|
# A field with a default value should be reset to default when omitted
|
||||||
|
data = {
|
||||||
|
'required_field': 'required_field_updated',
|
||||||
|
'extra': 'extra_updated',
|
||||||
|
'extra_not_nullable': 'extra_not_nullable_updated',
|
||||||
|
}
|
||||||
serializer = self.serializer_class(instance=instance, data=data)
|
serializer = self.serializer_class(instance=instance, data=data)
|
||||||
self.assertTrue(serializer.is_valid())
|
self.assertTrue(serializer.is_valid())
|
||||||
instance = serializer.save()
|
instance = serializer.save()
|
||||||
self.assertEqual(instance.text, 'foobar')
|
self.assertEqual(instance.text, 'foobar')
|
||||||
self.assertEqual(instance.extra, None)
|
self.assertEqual(instance.required_field, 'required_field_updated')
|
||||||
self.assertEqual(instance.extra_not_nullable, '')
|
self.assertEqual(instance.extra, 'extra_updated')
|
||||||
|
self.assertEqual(instance.extra_not_nullable, 'extra_not_nullable_updated')
|
||||||
|
|
||||||
|
|
||||||
class CallableDefaultValueTests(TestCase):
|
class CallableDefaultValueTests(TestCase):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user