mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[3.2.x] Fixed #32620 -- Allowed subclasses of Big/SmallAutoField for DEFAULT_AUTO_FIELD.
Backport of 45a58c31e6 from main
			
			
This commit is contained in:
		
				
					committed by
					
						 Mariusz Felisiak
						Mariusz Felisiak
					
				
			
			
				
	
			
			
			
						parent
						
							55da04488e
						
					
				
				
					commit
					49e618f4af
				
			| @@ -2524,7 +2524,7 @@ class AutoFieldMeta(type): | |||||||
|         return isinstance(instance, self._subclasses) or super().__instancecheck__(instance) |         return isinstance(instance, self._subclasses) or super().__instancecheck__(instance) | ||||||
|  |  | ||||||
|     def __subclasscheck__(self, subclass): |     def __subclasscheck__(self, subclass): | ||||||
|         return subclass in self._subclasses or super().__subclasscheck__(subclass) |         return issubclass(subclass, self._subclasses) or super().__subclasscheck__(subclass) | ||||||
|  |  | ||||||
|  |  | ||||||
| class AutoField(AutoFieldMixin, IntegerField, metaclass=AutoFieldMeta): | class AutoField(AutoFieldMixin, IntegerField, metaclass=AutoFieldMeta): | ||||||
|   | |||||||
| @@ -10,3 +10,7 @@ Bugfixes | |||||||
| ======== | ======== | ||||||
|  |  | ||||||
| * Corrected detection of GDAL 3.2 on Windows (:ticket:`32544`). | * Corrected detection of GDAL 3.2 on Windows (:ticket:`32544`). | ||||||
|  |  | ||||||
|  | * Fixed a bug in Django 3.2 where subclasses of ``BigAutoField`` and | ||||||
|  |   ``SmallAutoField`` were not allowed for the :setting:`DEFAULT_AUTO_FIELD` | ||||||
|  |   setting (:ticket:`32620`). | ||||||
|   | |||||||
| @@ -30,6 +30,18 @@ class AutoFieldInheritanceTests(SimpleTestCase): | |||||||
|                 self.assertIsInstance(field(), models.AutoField) |                 self.assertIsInstance(field(), models.AutoField) | ||||||
|  |  | ||||||
|     def test_issubclass_of_autofield(self): |     def test_issubclass_of_autofield(self): | ||||||
|         for field in (models.BigAutoField, models.SmallAutoField): |         class MyBigAutoField(models.BigAutoField): | ||||||
|  |             pass | ||||||
|  |  | ||||||
|  |         class MySmallAutoField(models.SmallAutoField): | ||||||
|  |             pass | ||||||
|  |  | ||||||
|  |         tests = [ | ||||||
|  |             MyBigAutoField, | ||||||
|  |             MySmallAutoField, | ||||||
|  |             models.BigAutoField, | ||||||
|  |             models.SmallAutoField, | ||||||
|  |         ] | ||||||
|  |         for field in tests: | ||||||
|             with self.subTest(field.__name__): |             with self.subTest(field.__name__): | ||||||
|                 self.assertTrue(issubclass(field, models.AutoField)) |                 self.assertTrue(issubclass(field, models.AutoField)) | ||||||
|   | |||||||
| @@ -4,6 +4,10 @@ from django.test import SimpleTestCase, override_settings | |||||||
| from django.test.utils import isolate_apps | from django.test.utils import isolate_apps | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class MyBigAutoField(models.BigAutoField): | ||||||
|  |     pass | ||||||
|  |  | ||||||
|  |  | ||||||
| @isolate_apps('model_options') | @isolate_apps('model_options') | ||||||
| class TestDefaultPK(SimpleTestCase): | class TestDefaultPK(SimpleTestCase): | ||||||
|     @override_settings(DEFAULT_AUTO_FIELD='django.db.models.NonexistentAutoField') |     @override_settings(DEFAULT_AUTO_FIELD='django.db.models.NonexistentAutoField') | ||||||
| @@ -74,6 +78,15 @@ class TestDefaultPK(SimpleTestCase): | |||||||
|  |  | ||||||
|         self.assertIsInstance(Model._meta.pk, models.SmallAutoField) |         self.assertIsInstance(Model._meta.pk, models.SmallAutoField) | ||||||
|  |  | ||||||
|  |     @override_settings( | ||||||
|  |         DEFAULT_AUTO_FIELD='model_options.test_default_pk.MyBigAutoField' | ||||||
|  |     ) | ||||||
|  |     def test_default_auto_field_setting_bigautofield_subclass(self): | ||||||
|  |         class Model(models.Model): | ||||||
|  |             pass | ||||||
|  |  | ||||||
|  |         self.assertIsInstance(Model._meta.pk, MyBigAutoField) | ||||||
|  |  | ||||||
|     @isolate_apps('model_options.apps.ModelPKConfig') |     @isolate_apps('model_options.apps.ModelPKConfig') | ||||||
|     @override_settings(DEFAULT_AUTO_FIELD='django.db.models.AutoField') |     @override_settings(DEFAULT_AUTO_FIELD='django.db.models.AutoField') | ||||||
|     def test_app_default_auto_field(self): |     def test_app_default_auto_field(self): | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user