Merge pull request #920 from DavidBord/fix-914
ListField of embedded docs doesn't set the _instance attribute when iterating over it
This commit is contained in:
		| @@ -5,6 +5,7 @@ Changelog | |||||||
|  |  | ||||||
| Changes in 0.9.X - DEV | 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 | - Support += and *= for ListField #595 | ||||||
|  |  | ||||||
| Changes in 0.9.0 | Changes in 0.9.0 | ||||||
|   | |||||||
| @@ -125,6 +125,10 @@ class BaseList(list): | |||||||
|             value._instance = self._instance |             value._instance = self._instance | ||||||
|         return value |         return value | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for i in xrange(self.__len__()): | ||||||
|  |             yield self[i] | ||||||
|  |  | ||||||
|     def __setitem__(self, key, value, *args, **kwargs): |     def __setitem__(self, key, value, *args, **kwargs): | ||||||
|         if isinstance(key, slice): |         if isinstance(key, slice): | ||||||
|             self._mark_as_changed() |             self._mark_as_changed() | ||||||
|   | |||||||
| @@ -2799,5 +2799,21 @@ class InstanceTest(unittest.TestCase): | |||||||
|         self.assertNotEqual(p, p1) |         self.assertNotEqual(p, p1) | ||||||
|         self.assertEqual(p, p) |         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__': | if __name__ == '__main__': | ||||||
|     unittest.main() |     unittest.main() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user