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)
|
return instance.__dict__.get(self._name, self._default)
|
||||||
|
|
||||||
def __set__(self, instance, value):
|
def __set__(self, instance, value):
|
||||||
if value is None:
|
|
||||||
value = self._default
|
|
||||||
value = self.validate(value)
|
|
||||||
if value is not None:
|
if value is not None:
|
||||||
instance.__dict__[self._name] = value
|
value = self.validate(value)
|
||||||
else:
|
|
||||||
|
if value is None or value == self._default:
|
||||||
self.__delete__(instance)
|
self.__delete__(instance)
|
||||||
|
else:
|
||||||
|
instance.__dict__[self._name] = value
|
||||||
|
|
||||||
def __delete__(self, instance):
|
def __delete__(self, instance):
|
||||||
instance.__dict__.pop(self._name, None)
|
instance.__dict__.pop(self._name, None)
|
||||||
@ -146,8 +146,6 @@ class ImmutableObject(object):
|
|||||||
raise TypeError(
|
raise TypeError(
|
||||||
'__init__() got an unexpected keyword argument "%s"' %
|
'__init__() got an unexpected keyword argument "%s"' %
|
||||||
key)
|
key)
|
||||||
if value == getattr(self, key):
|
|
||||||
continue # Don't explicitly set default values
|
|
||||||
super(ImmutableObject, self).__setattr__(key, value)
|
super(ImmutableObject, self).__setattr__(key, value)
|
||||||
|
|
||||||
def __setattr__(self, name, value):
|
def __setattr__(self, name, value):
|
||||||
|
|||||||
@ -59,6 +59,14 @@ class FieldDescriptorTest(unittest.TestCase):
|
|||||||
self.assertEqual(None, instance.attr)
|
self.assertEqual(None, instance.attr)
|
||||||
self.assertNotIn('attr', instance.__dict__)
|
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):
|
class FieldTest(unittest.TestCase):
|
||||||
def test_default_handling(self):
|
def test_default_handling(self):
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user