summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Johnson <me@adamj.eu>2021-04-08 11:40:16 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-04-08 13:44:21 +0200
commit49e618f4af422d0c8828775ca7a0bbd48288a585 (patch)
tree3dc7f166ecab0a0688825f6e958d0f2acb127fd8
parent55da04488e0998df15d911528445a077e6fb4e0f (diff)
downloaddjango-49e618f4af422d0c8828775ca7a0bbd48288a585.tar.gz
[3.2.x] Fixed #32620 -- Allowed subclasses of Big/SmallAutoField for DEFAULT_AUTO_FIELD.
Backport of 45a58c31e64dbfdecab1178b1d00a3803a90ea2d from main
-rw-r--r--django/db/models/fields/__init__.py2
-rw-r--r--docs/releases/3.2.1.txt4
-rw-r--r--tests/model_fields/test_autofield.py14
-rw-r--r--tests/model_options/test_default_pk.py13
4 files changed, 31 insertions, 2 deletions
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index 5b8b3cab23..167c3d2f03 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -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):
diff --git a/docs/releases/3.2.1.txt b/docs/releases/3.2.1.txt
index d303b46d4d..e8361e7370 100644
--- a/docs/releases/3.2.1.txt
+++ b/docs/releases/3.2.1.txt
@@ -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`).
diff --git a/tests/model_fields/test_autofield.py b/tests/model_fields/test_autofield.py
index 646cd2ab0a..0ae981c3d9 100644
--- a/tests/model_fields/test_autofield.py
+++ b/tests/model_fields/test_autofield.py
@@ -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))
diff --git a/tests/model_options/test_default_pk.py b/tests/model_options/test_default_pk.py
index b678848916..a3beaba7c3 100644
--- a/tests/model_options/test_default_pk.py
+++ b/tests/model_options/test_default_pk.py
@@ -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):