mirror of
				https://github.com/django/django.git
				synced 2025-10-31 01:25:32 +00:00 
			
		
		
		
	Fixed #22073 - Ensure CreateTable operation handles backwards migration correctly when M2M fields are present
This commit is contained in:
		| @@ -268,6 +268,11 @@ class BaseDatabaseSchemaEditor(object): | ||||
|         """ | ||||
|         Deletes a model from the database. | ||||
|         """ | ||||
|         # Handle auto-created intermediary models | ||||
|         for field in model._meta.local_many_to_many: | ||||
|             if field.rel.through._meta.auto_created: | ||||
|                 self.delete_model(field.rel.through) | ||||
|  | ||||
|         # Delete the table | ||||
|         self.execute(self.sql_delete_table % { | ||||
|             "table": self.quote_name(model._meta.db_table), | ||||
|   | ||||
| @@ -90,6 +90,46 @@ class OperationTests(MigrationTestBase): | ||||
|         self.assertEqual(len(definition[2]), 0) | ||||
|         self.assertEqual(definition[1][0], "Pony") | ||||
|  | ||||
|     def test_create_model_m2m(self): | ||||
|         """ | ||||
|         Test the creation of a model with a ManyToMany field and the | ||||
|         auto-created "through" model. | ||||
|         """ | ||||
|         project_state = self.set_up_test_model("test_crmomm") | ||||
|         operation = migrations.CreateModel( | ||||
|             "Stable", | ||||
|             [ | ||||
|                 ("id", models.AutoField(primary_key=True)), | ||||
|                 ("ponies", models.ManyToManyField("Pony", related_name="stables")) | ||||
|             ] | ||||
|         ) | ||||
|         # Test the state alteration | ||||
|         new_state = project_state.clone() | ||||
|         operation.state_forwards("test_crmomm", new_state) | ||||
|         # Test the database alteration | ||||
|         self.assertTableNotExists("test_crmomm_stable_ponies") | ||||
|         with connection.schema_editor() as editor: | ||||
|             operation.database_forwards("test_crmomm", editor, project_state, new_state) | ||||
|         self.assertTableExists("test_crmomm_stable") | ||||
|         self.assertTableExists("test_crmomm_stable_ponies") | ||||
|         self.assertColumnNotExists("test_crmomm", "ponies") | ||||
|         # Make sure the M2M field actually works | ||||
|         with atomic(): | ||||
|             new_apps = new_state.render() | ||||
|             Pony = new_apps.get_model("test_crmomm", "Pony") | ||||
|             Stable = new_apps.get_model("test_crmomm", "Stable") | ||||
|             stable = Stable.objects.create() | ||||
|             p1 = Pony.objects.create(pink=False, weight=4.55) | ||||
|             p2 = Pony.objects.create(pink=True, weight=5.43) | ||||
|             stable.ponies.add(p1, p2) | ||||
|             self.assertEqual(stable.ponies.count(), 2) | ||||
|             stable.ponies.all().delete() | ||||
|         # And test reversal | ||||
|         with connection.schema_editor() as editor: | ||||
|             operation.database_backwards("test_crmomm", editor, new_state, project_state) | ||||
|         self.assertTableNotExists("test_crmomm_stable") | ||||
|         self.assertTableNotExists("test_crmomm_stable_ponies") | ||||
|  | ||||
|     def test_create_model_inheritance(self): | ||||
|         """ | ||||
|         Tests the CreateModel operation on a multi-table inheritance setup. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user