Ensure that EmbeddedDocumentFields can contain their own documents.
(self)
| 1442 | assert peter.friends == friends |
| 1443 | |
| 1444 | def test_recursive_embedding(self): |
| 1445 | """Ensure that EmbeddedDocumentFields can contain their own documents.""" |
| 1446 | |
| 1447 | class TreeNode(EmbeddedDocument): |
| 1448 | name = StringField() |
| 1449 | children = ListField(EmbeddedDocumentField("self")) |
| 1450 | |
| 1451 | class Tree(Document): |
| 1452 | name = StringField() |
| 1453 | children = ListField(EmbeddedDocumentField("TreeNode")) |
| 1454 | |
| 1455 | Tree.drop_collection() |
| 1456 | |
| 1457 | tree = Tree(name="Tree") |
| 1458 | first_child = TreeNode(name="Child 1") |
| 1459 | tree.children.append(first_child) |
| 1460 | |
| 1461 | second_child = TreeNode(name="Child 2") |
| 1462 | first_child.children.append(second_child) |
| 1463 | tree.save() |
| 1464 | |
| 1465 | tree = Tree.objects.first() |
| 1466 | assert len(tree.children) == 1 |
| 1467 | |
| 1468 | assert len(tree.children[0].children) == 1 |
| 1469 | |
| 1470 | third_child = TreeNode(name="Child 3") |
| 1471 | tree.children[0].children.append(third_child) |
| 1472 | tree.save() |
| 1473 | |
| 1474 | assert len(tree.children) == 1 |
| 1475 | assert tree.children[0].name == first_child.name |
| 1476 | assert tree.children[0].children[0].name == second_child.name |
| 1477 | assert tree.children[0].children[1].name == third_child.name |
| 1478 | |
| 1479 | # Test updating |
| 1480 | tree.children[0].name = "I am Child 1" |
| 1481 | tree.children[0].children[0].name = "I am Child 2" |
| 1482 | tree.children[0].children[1].name = "I am Child 3" |
| 1483 | tree.save() |
| 1484 | |
| 1485 | assert tree.children[0].name == "I am Child 1" |
| 1486 | assert tree.children[0].children[0].name == "I am Child 2" |
| 1487 | assert tree.children[0].children[1].name == "I am Child 3" |
| 1488 | |
| 1489 | # Test removal |
| 1490 | assert len(tree.children[0].children) == 2 |
| 1491 | del tree.children[0].children[1] |
| 1492 | |
| 1493 | tree.save() |
| 1494 | assert len(tree.children[0].children) == 1 |
| 1495 | |
| 1496 | tree.children[0].children.pop(0) |
| 1497 | tree.save() |
| 1498 | assert len(tree.children[0].children) == 0 |
| 1499 | assert tree.children[0].children == [] |
| 1500 | |
| 1501 | tree.children[0].children.insert(0, third_child) |