models: Make fields handle unsetting defaults in __dict__
This commit is contained in:
parent
7eda0160ca
commit
2d03cd7290
@ -45,13 +45,13 @@ class Field(object):
|
||||
return instance.__dict__.get(self._name, self._default)
|
||||
|
||||
def __set__(self, instance, value):
|
||||
if value is None:
|
||||
value = self._default
|
||||
value = self.validate(value)
|
||||
if value is not None:
|
||||
instance.__dict__[self._name] = value
|
||||
else:
|
||||
value = self.validate(value)
|
||||
|
||||
if value is None or value == self._default:
|
||||
self.__delete__(instance)
|
||||
else:
|
||||
instance.__dict__[self._name] = value
|
||||
|
||||
def __delete__(self, instance):
|
||||
instance.__dict__.pop(self._name, None)
|
||||
@ -146,8 +146,6 @@ class ImmutableObject(object):
|
||||
raise TypeError(
|
||||
'__init__() got an unexpected keyword argument "%s"' %
|
||||
key)
|
||||
if value == getattr(self, key):
|
||||
continue # Don't explicitly set default values
|
||||
super(ImmutableObject, self).__setattr__(key, value)
|
||||
|
||||
def __setattr__(self, name, value):
|
||||
|
||||
@ -59,6 +59,14 @@ class FieldDescriptorTest(unittest.TestCase):
|
||||
self.assertEqual(None, instance.attr)
|
||||
self.assertNotIn('attr', instance.__dict__)
|
||||
|
||||
def test_field_can_be_set_default(self):
|
||||
default = object()
|
||||
instance = create_instance(Field(default=default))
|
||||
instance.attr = 1234
|
||||
instance.attr = default
|
||||
self.assertEqual(default, instance.attr)
|
||||
self.assertNotIn('attr', instance.__dict__)
|
||||
|
||||
|
||||
class FieldTest(unittest.TestCase):
|
||||
def test_default_handling(self):
|
||||
|
||||
Loading…
Reference in New Issue
Block a user