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) | ||||
|  | ||||
|     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): | ||||
|   | ||||
| @@ -10,3 +10,7 @@ Bugfixes | ||||
| ======== | ||||
|  | ||||
| * 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) | ||||
|  | ||||
|     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__): | ||||
|                 self.assertTrue(issubclass(field, models.AutoField)) | ||||
|   | ||||
| @@ -4,6 +4,10 @@ from django.test import SimpleTestCase, override_settings | ||||
| from django.test.utils import isolate_apps | ||||
|  | ||||
|  | ||||
| class MyBigAutoField(models.BigAutoField): | ||||
|     pass | ||||
|  | ||||
|  | ||||
| @isolate_apps('model_options') | ||||
| class TestDefaultPK(SimpleTestCase): | ||||
|     @override_settings(DEFAULT_AUTO_FIELD='django.db.models.NonexistentAutoField') | ||||
| @@ -74,6 +78,15 @@ class TestDefaultPK(SimpleTestCase): | ||||
|  | ||||
|         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') | ||||
|     @override_settings(DEFAULT_AUTO_FIELD='django.db.models.AutoField') | ||||
|     def test_app_default_auto_field(self): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user