fix-#914: ListField of embedded docs doesn't set the _instance attribute when iterating over it

This commit is contained in:
David Bordeynik 2015-03-30 15:28:28 +03:00
parent 1001f1bd36
commit bb77838b3e
3 changed files with 21 additions and 0 deletions

View File

@ -5,6 +5,7 @@ Changelog
Changes in 0.9.X - DEV
======================
- ListField of embedded docs doesn't set the _instance attribute when iterating over it #914
- Support += and *= for ListField #595
Changes in 0.9.0

View File

@ -125,6 +125,10 @@ class BaseList(list):
value._instance = self._instance
return value
def __iter__(self):
for i in xrange(self.__len__()):
yield self[i]
def __setitem__(self, key, value, *args, **kwargs):
if isinstance(key, slice):
self._mark_as_changed()

View File

@ -2799,5 +2799,21 @@ class InstanceTest(unittest.TestCase):
self.assertNotEqual(p, p1)
self.assertEqual(p, p)
def test_list_iter(self):
# 914
class B(EmbeddedDocument):
v = StringField()
class A(Document):
l = ListField(EmbeddedDocumentField(B))
A.objects.delete()
A(l=[B(v='1'), B(v='2'), B(v='3')]).save()
a = A.objects.get()
self.assertEqual(a.l._instance, a)
for idx, b in enumerate(a.l):
self.assertEqual(b._instance, a)
self.assertEqual(idx, 2)
if __name__ == '__main__':
unittest.main()