mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #33563 -- Fixed contenttype reverse data migration crash with a multiple databases setup.
This commit is contained in:
		| @@ -2,8 +2,9 @@ from django.db import migrations, models | ||||
|  | ||||
|  | ||||
| def add_legacy_name(apps, schema_editor): | ||||
|     alias = schema_editor.connection.alias | ||||
|     ContentType = apps.get_model("contenttypes", "ContentType") | ||||
|     for ct in ContentType.objects.all(): | ||||
|     for ct in ContentType.objects.using(alias): | ||||
|         try: | ||||
|             ct.name = apps.get_model(ct.app_label, ct.model)._meta.object_name | ||||
|         except LookupError: | ||||
|   | ||||
							
								
								
									
										31
									
								
								tests/contenttypes_tests/test_migrations.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								tests/contenttypes_tests/test_migrations.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| from importlib import import_module | ||||
|  | ||||
| from django.apps import apps | ||||
| from django.contrib.auth.models import Permission | ||||
| from django.contrib.contenttypes.models import ContentType | ||||
| from django.db import DEFAULT_DB_ALIAS, connections | ||||
| from django.test import TransactionTestCase | ||||
|  | ||||
| remove_content_type_name = import_module( | ||||
|     "django.contrib.contenttypes.migrations.0002_remove_content_type_name" | ||||
| ) | ||||
|  | ||||
|  | ||||
| class MultiDBRemoveContentTypeNameTests(TransactionTestCase): | ||||
|     databases = {"default", "other"} | ||||
|     available_apps = ["django.contrib.auth", "django.contrib.contenttypes"] | ||||
|  | ||||
|     def test_add_legacy_name_other_database(self): | ||||
|         # add_legacy_name() should update ContentType objects in the specified | ||||
|         # database. Remove ContentTypes from the default database to distinct | ||||
|         # from which database they are fetched. | ||||
|         Permission.objects.all().delete() | ||||
|         ContentType.objects.all().delete() | ||||
|         # ContentType.name in the current version is a property and cannot be | ||||
|         # set, so an AttributeError is raised with the other database. | ||||
|         with self.assertRaises(AttributeError): | ||||
|             with connections["other"].schema_editor() as editor: | ||||
|                 remove_content_type_name.add_legacy_name(apps, editor) | ||||
|         # ContentType were removed from the default database. | ||||
|         with connections[DEFAULT_DB_ALIAS].schema_editor() as editor: | ||||
|             remove_content_type_name.add_legacy_name(apps, editor) | ||||
		Reference in New Issue
	
	Block a user