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 '
'a valid field')
self.field = field
kwargs.setdefault('default', [])
kwargs.setdefault('default', lambda: [])
super(ListField, self).__init__(**kwargs)
def __get__(self, instance, owner):
@ -356,7 +356,7 @@ class DictField(BaseField):
def __init__(self, basecls=None, *args, **kwargs):
self.basecls = basecls or BaseField
assert issubclass(self.basecls, BaseField)
kwargs.setdefault('default', {})
kwargs.setdefault('default', lambda: {})
super(DictField, self).__init__(*args, **kwargs)
def validate(self, value):
@ -623,4 +623,4 @@ class GeoPointField(BaseField):
raise ValidationError('Value must be a two-dimensional point.')
if (not isinstance(value[0], (float, int)) and
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()
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__':
unittest.main()