From 1d16c5d562a67625f7309cc7765b8c57d49bf182 Mon Sep 17 00:00:00 2001 From: Simon Charette Date: Sun, 5 Apr 2020 01:25:59 -0400 Subject: Refs #27666 -- Ensured relationship consistency on delayed reloads. Delayed reloads of state models broke identity based relationships between direct and non-direct ancestors. Basing models.Options related objects map of model labels instead of their identity ensured relationship consistency is maintained. Refs #30966. Co-authored-by: Hasan Ramezani --- tests/migrations/test_state.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'tests') diff --git a/tests/migrations/test_state.py b/tests/migrations/test_state.py index ef198eb0b6..44d4cdf268 100644 --- a/tests/migrations/test_state.py +++ b/tests/migrations/test_state.py @@ -532,6 +532,30 @@ class StateTests(SimpleTestCase): project_state.add_model(ModelState.from_model(B)) self.assertEqual(len(project_state.apps.get_models()), 2) + def test_reload_model_relationship_consistency(self): + project_state = ProjectState() + project_state.add_model(ModelState('migrations', 'A', [])) + project_state.add_model(ModelState('migrations', 'B', [ + ('a', models.ForeignKey('A', models.CASCADE)), + ])) + project_state.add_model(ModelState('migrations', 'C', [ + ('b', models.ForeignKey('B', models.CASCADE)), + ])) + A = project_state.apps.get_model('migrations.A') + B = project_state.apps.get_model('migrations.B') + C = project_state.apps.get_model('migrations.C') + self.assertEqual([r.related_model for r in A._meta.related_objects], [B]) + self.assertEqual([r.related_model for r in B._meta.related_objects], [C]) + self.assertEqual([r.related_model for r in C._meta.related_objects], []) + + project_state.reload_model('migrations', 'a', delay=True) + A = project_state.apps.get_model('migrations.A') + B = project_state.apps.get_model('migrations.B') + C = project_state.apps.get_model('migrations.C') + self.assertEqual([r.related_model for r in A._meta.related_objects], [B]) + self.assertEqual([r.related_model for r in B._meta.related_objects], [C]) + self.assertEqual([r.related_model for r in C._meta.related_objects], []) + def test_add_relations(self): """ #24573 - Adding relations to existing models should reload the -- cgit v1.3