mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #23503 -- Fixed renaming of model with self-referential m2m field.
This commit is contained in:
		
				
					committed by
					
						 Tim Graham
						Tim Graham
					
				
			
			
				
	
			
			
			
						parent
						
							83cd18633f
						
					
				
				
					commit
					463952d940
				
			| @@ -724,6 +724,12 @@ class BaseDatabaseSchemaEditor(object): | ||||
|             old_field.rel.through._meta.get_field_by_name(old_field.m2m_reverse_field_name())[0], | ||||
|             new_field.rel.through._meta.get_field_by_name(new_field.m2m_reverse_field_name())[0], | ||||
|         ) | ||||
|         self.alter_field( | ||||
|             new_field.rel.through, | ||||
|             # for self-referential models we need to alter field from the other end too | ||||
|             old_field.rel.through._meta.get_field_by_name(old_field.m2m_field_name())[0], | ||||
|             new_field.rel.through._meta.get_field_by_name(new_field.m2m_field_name())[0], | ||||
|         ) | ||||
|  | ||||
|     def _create_index_name(self, model, column_names, suffix=""): | ||||
|         """ | ||||
|   | ||||
| @@ -58,3 +58,6 @@ Bugfixes | ||||
|  | ||||
| * Added quoting of constraint names in the SQL generated by migrations to | ||||
|   prevent crash with uppercase characters in the name (:ticket:`23065`). | ||||
|  | ||||
| * Fixed renaming of models with a self-referential many-to-many field | ||||
|   (``ManyToManyField('self')``) (:ticket:`23503`). | ||||
|   | ||||
| @@ -472,6 +472,22 @@ class OperationTests(OperationTestBase): | ||||
|             self.assertFKExists("test_rmwsrf_rider", ["friend_id"], ("test_rmwsrf_rider", "id")) | ||||
|             self.assertFKNotExists("test_rmwsrf_rider", ["friend_id"], ("test_rmwsrf_horserider", "id")) | ||||
|  | ||||
|     def test_rename_model_with_self_referential_m2m(self): | ||||
|         app_label = "test_rename_model_with_self_referential_m2m" | ||||
|  | ||||
|         project_state = self.apply_operations(app_label, ProjectState(), operations=[ | ||||
|             migrations.CreateModel("ReflexivePony", fields=[ | ||||
|                 ("ponies", models.ManyToManyField("self")), | ||||
|             ]), | ||||
|         ]) | ||||
|         project_state = self.apply_operations(app_label, project_state, operations=[ | ||||
|             migrations.RenameModel("ReflexivePony", "ReflexivePony2"), | ||||
|         ]) | ||||
|         apps = project_state.render() | ||||
|         Pony = apps.get_model(app_label, "ReflexivePony2") | ||||
|         pony = Pony.objects.create() | ||||
|         pony.ponies.add(pony) | ||||
|  | ||||
|     def test_add_field(self): | ||||
|         """ | ||||
|         Tests the AddField operation. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user