#24225 - Relations between models are updated while remaining the relations and references for models of an old state.
(self)
| 748 | self.assertIs(model_c_new._meta.get_field("to_a").related_model, model_a_new) |
| 749 | |
| 750 | def test_remove_relations(self): |
| 751 | """ |
| 752 | #24225 - Relations between models are updated while |
| 753 | remaining the relations and references for models of an old state. |
| 754 | """ |
| 755 | new_apps = Apps() |
| 756 | |
| 757 | class A(models.Model): |
| 758 | class Meta: |
| 759 | app_label = "something" |
| 760 | apps = new_apps |
| 761 | |
| 762 | class B(models.Model): |
| 763 | to_a = models.ForeignKey(A, models.CASCADE) |
| 764 | |
| 765 | class Meta: |
| 766 | app_label = "something" |
| 767 | apps = new_apps |
| 768 | |
| 769 | def get_model_a(state): |
| 770 | return [ |
| 771 | mod for mod in state.apps.get_models() if mod._meta.model_name == "a" |
| 772 | ][0] |
| 773 | |
| 774 | project_state = ProjectState() |
| 775 | project_state.add_model(ModelState.from_model(A)) |
| 776 | project_state.add_model(ModelState.from_model(B)) |
| 777 | self.assertEqual(len(get_model_a(project_state)._meta.related_objects), 1) |
| 778 | old_state = project_state.clone() |
| 779 | |
| 780 | operation = RemoveField("b", "to_a") |
| 781 | operation.state_forwards("something", project_state) |
| 782 | # Model from old_state still has the relation |
| 783 | model_a_old = get_model_a(old_state) |
| 784 | model_a_new = get_model_a(project_state) |
| 785 | self.assertIsNot(model_a_old, model_a_new) |
| 786 | self.assertEqual(len(model_a_old._meta.related_objects), 1) |
| 787 | self.assertEqual(len(model_a_new._meta.related_objects), 0) |
| 788 | |
| 789 | # Same test for deleted model |
| 790 | project_state = ProjectState() |
| 791 | project_state.add_model(ModelState.from_model(A)) |
| 792 | project_state.add_model(ModelState.from_model(B)) |
| 793 | old_state = project_state.clone() |
| 794 | |
| 795 | operation = DeleteModel("b") |
| 796 | operation.state_forwards("something", project_state) |
| 797 | model_a_old = get_model_a(old_state) |
| 798 | model_a_new = get_model_a(project_state) |
| 799 | self.assertIsNot(model_a_old, model_a_new) |
| 800 | self.assertEqual(len(model_a_old._meta.related_objects), 1) |
| 801 | self.assertEqual(len(model_a_new._meta.related_objects), 0) |
| 802 | |
| 803 | def test_self_relation(self): |
| 804 | """ |
nothing calls this directly
no test coverage detected