Fixed {Dict,List}Field default issue. Closes #46.

This commit is contained in:
Harry Marr 2010-08-30 13:00:34 +01:00
parent d99c5973c3
commit 3b62cf80cd
2 changed files with 16 additions and 3 deletions

View File

@ -263,7 +263,7 @@ class ListField(BaseField):
raise ValidationError('Argument to ListField constructor must be ' raise ValidationError('Argument to ListField constructor must be '
'a valid field') 'a valid field')
self.field = field self.field = field
kwargs.setdefault('default', []) kwargs.setdefault('default', lambda: [])
super(ListField, self).__init__(**kwargs) super(ListField, self).__init__(**kwargs)
def __get__(self, instance, owner): def __get__(self, instance, owner):
@ -356,7 +356,7 @@ class DictField(BaseField):
def __init__(self, basecls=None, *args, **kwargs): def __init__(self, basecls=None, *args, **kwargs):
self.basecls = basecls or BaseField self.basecls = basecls or BaseField
assert issubclass(self.basecls, BaseField) assert issubclass(self.basecls, BaseField)
kwargs.setdefault('default', {}) kwargs.setdefault('default', lambda: {})
super(DictField, self).__init__(*args, **kwargs) super(DictField, self).__init__(*args, **kwargs)
def validate(self, value): def validate(self, value):
@ -623,4 +623,4 @@ class GeoPointField(BaseField):
raise ValidationError('Value must be a two-dimensional point.') raise ValidationError('Value must be a two-dimensional point.')
if (not isinstance(value[0], (float, int)) and if (not isinstance(value[0], (float, int)) and
not isinstance(value[1], (float, int))): not isinstance(value[1], (float, int))):
raise ValidationError('Both values in point must be float or int.') raise ValidationError('Both values in point must be float or int.')

View File

@ -693,5 +693,18 @@ class FieldTest(unittest.TestCase):
Event.drop_collection() Event.drop_collection()
def test_ensure_unique_default_instances(self):
"""Ensure that every document has it's own unique default instance."""
class D(Document):
data = DictField()
data2 = DictField(default=lambda: {})
d1 = D()
d1.data['foo'] = 'bar'
d1.data2['foo'] = 'bar'
d2 = D()
self.assertEqual(d2.data, {})
self.assertEqual(d2.data2, {})
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()