mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[4.0.x] Fixed #31503 -- Made autodetector remove unique/index_together before altering fields.
Backport of 0314593fe8 from main
			
			
This commit is contained in:
		
				
					committed by
					
						 Mariusz Felisiak
						Mariusz Felisiak
					
				
			
			
				
	
			
			
			
						parent
						
							c9ebe4ca4e
						
					
				
				
					commit
					ea00a0843e
				
			| @@ -1564,9 +1564,26 @@ class AutodetectorTests(TestCase): | ||||
|         ) | ||||
|         # Right number/type of migrations? | ||||
|         self.assertNumberMigrations(changes, "otherapp", 1) | ||||
|         self.assertOperationTypes(changes, "otherapp", 0, ["AlterUniqueTogether", "AlterIndexTogether"]) | ||||
|         self.assertOperationAttributes(changes, "otherapp", 0, 0, name="book", unique_together={("title", "author")}) | ||||
|         self.assertOperationAttributes(changes, "otherapp", 0, 1, name="book", index_together={("title", "author")}) | ||||
|         self.assertOperationTypes(changes, 'otherapp', 0, [ | ||||
|             'AlterUniqueTogether', | ||||
|             'AlterIndexTogether', | ||||
|             'AlterUniqueTogether', | ||||
|             'AlterIndexTogether', | ||||
|         ]) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 0, name='book', unique_together=set(), | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 1, name='book', index_together=set(), | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 2, name='book', | ||||
|             unique_together={('title', 'author')}, | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 3, name='book', | ||||
|             index_together={('title', 'author')}, | ||||
|         ) | ||||
|  | ||||
|     def test_add_field_and_foo_together(self): | ||||
|         """ | ||||
| @@ -1613,10 +1630,100 @@ class AutodetectorTests(TestCase): | ||||
|         ) | ||||
|         # Right number/type of migrations? | ||||
|         self.assertNumberMigrations(changes, "otherapp", 1) | ||||
|         self.assertOperationTypes(changes, "otherapp", 0, ["AlterUniqueTogether", "AlterIndexTogether", "RemoveField"]) | ||||
|         self.assertOperationAttributes(changes, "otherapp", 0, 0, name="book", unique_together={("author", "title")}) | ||||
|         self.assertOperationAttributes(changes, "otherapp", 0, 1, name="book", index_together={("author", "title")}) | ||||
|         self.assertOperationAttributes(changes, "otherapp", 0, 2, model_name="book", name="newfield") | ||||
|         self.assertOperationTypes(changes, 'otherapp', 0, [ | ||||
|             'AlterUniqueTogether', | ||||
|             'AlterIndexTogether', | ||||
|             'AlterUniqueTogether', | ||||
|             'AlterIndexTogether', | ||||
|             'RemoveField', | ||||
|         ]) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 0, name='book', unique_together=set(), | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 1, name='book', index_together=set(), | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 2, name='book', | ||||
|             unique_together={('author', 'title')}, | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 3, name='book', | ||||
|             index_together={('author', 'title')}, | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 4, model_name='book', name='newfield', | ||||
|         ) | ||||
|  | ||||
|     def test_alter_field_and_foo_together(self): | ||||
|         """Fields are altered after deleting some index/unique_together.""" | ||||
|         initial_author = ModelState('testapp', 'Author', [ | ||||
|             ('id', models.AutoField(primary_key=True)), | ||||
|             ('name', models.CharField(max_length=200)), | ||||
|             ('age', models.IntegerField(db_index=True)), | ||||
|         ], { | ||||
|             'unique_together': {('name',)}, | ||||
|         }) | ||||
|         author_reversed_constraints = ModelState('testapp', 'Author', [ | ||||
|             ('id', models.AutoField(primary_key=True)), | ||||
|             ('name', models.CharField(max_length=200, unique=True)), | ||||
|             ('age', models.IntegerField()), | ||||
|         ], { | ||||
|             'index_together': {('age',)}, | ||||
|         }) | ||||
|         changes = self.get_changes([initial_author], [author_reversed_constraints]) | ||||
|  | ||||
|         self.assertNumberMigrations(changes, 'testapp', 1) | ||||
|         self.assertOperationTypes(changes, 'testapp', 0, [ | ||||
|             'AlterUniqueTogether', | ||||
|             'AlterField', | ||||
|             'AlterField', | ||||
|             'AlterIndexTogether', | ||||
|         ]) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'testapp', 0, 0, name='author', unique_together=set(), | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'testapp', 0, 1, model_name='author', name='age', | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'testapp', 0, 2, model_name='author', name='name', | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'testapp', 0, 3, name='author', index_together={('age',)}, | ||||
|         ) | ||||
|  | ||||
|     def test_partly_alter_foo_together(self): | ||||
|         initial_author = ModelState('testapp', 'Author', [ | ||||
|             ('id', models.AutoField(primary_key=True)), | ||||
|             ('name', models.CharField(max_length=200)), | ||||
|             ('age', models.IntegerField()), | ||||
|         ], { | ||||
|             'unique_together': {('name',), ('age',)}, | ||||
|             'index_together': {('name',)}, | ||||
|         }) | ||||
|         author_reversed_constraints = ModelState('testapp', 'Author', [ | ||||
|             ('id', models.AutoField(primary_key=True)), | ||||
|             ('name', models.CharField(max_length=200)), | ||||
|             ('age', models.IntegerField()), | ||||
|         ], { | ||||
|             'unique_together': {('age',)}, | ||||
|             'index_together': {('name',), ('age',)}, | ||||
|         }) | ||||
|         changes = self.get_changes([initial_author], [author_reversed_constraints]) | ||||
|  | ||||
|         self.assertNumberMigrations(changes, 'testapp', 1) | ||||
|         self.assertOperationTypes(changes, 'testapp', 0, [ | ||||
|             'AlterUniqueTogether', | ||||
|             'AlterIndexTogether', | ||||
|         ]) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'testapp', 0, 0, name='author', unique_together={('age',)}, | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'testapp', 0, 1, name='author', | ||||
|             index_together={('name',), ('age',)}, | ||||
|         ) | ||||
|  | ||||
|     def test_rename_field_and_foo_together(self): | ||||
|         """ | ||||
| @@ -1629,11 +1736,27 @@ class AutodetectorTests(TestCase): | ||||
|         ) | ||||
|         # Right number/type of migrations? | ||||
|         self.assertNumberMigrations(changes, "otherapp", 1) | ||||
|         self.assertOperationTypes(changes, "otherapp", 0, ["RenameField", "AlterUniqueTogether", "AlterIndexTogether"]) | ||||
|         self.assertOperationAttributes(changes, "otherapp", 0, 1, name="book", unique_together={ | ||||
|             ("title", "newfield2") | ||||
|         }) | ||||
|         self.assertOperationAttributes(changes, "otherapp", 0, 2, name="book", index_together={("title", "newfield2")}) | ||||
|         self.assertOperationTypes(changes, 'otherapp', 0, [ | ||||
|             'RenameField', | ||||
|             'AlterUniqueTogether', | ||||
|             'AlterIndexTogether', | ||||
|             'AlterUniqueTogether', | ||||
|             'AlterIndexTogether', | ||||
|         ]) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 1, name='book', unique_together=set(), | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 2, name='book', index_together=set(), | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 3, name='book', | ||||
|             unique_together={('title', 'newfield2')}, | ||||
|         ) | ||||
|         self.assertOperationAttributes( | ||||
|             changes, 'otherapp', 0, 4, name='book', | ||||
|             index_together={('title', 'newfield2')}, | ||||
|         ) | ||||
|  | ||||
|     def test_proxy(self): | ||||
|         """The autodetector correctly deals with proxy models.""" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user