Browse Source

Refs #31369 -- Deprecated models.NullBooleanField in favor of BooleanField(null=True).

Tim Schilling 5 years ago
parent
commit
a92cc84b4a

+ 8 - 0
django/db/models/fields/__init__.py

@@ -1929,6 +1929,14 @@ class NullBooleanField(BooleanField):
         'invalid_nullable': _('“%(value)s” value must be either None, True or False.'),
     }
     description = _("Boolean (Either True, False or None)")
+    system_check_deprecated_details = {
+        'msg': (
+            'NullBooleanField is deprecated. Support for it (except in '
+            'historical migrations) will be removed in Django 4.0.'
+        ),
+        'hint': 'Use BooleanField(null=True) instead.',
+        'id': 'fields.W903',
+    }
 
     def __init__(self, *args, **kwargs):
         kwargs['null'] = True

+ 3 - 0
docs/internals/deprecation.txt

@@ -75,6 +75,9 @@ details on these changes.
 * Support for passing raw column aliases to ``QuerySet.order_by()`` will be
   removed.
 
+* The model ``NullBooleanField`` will be removed. A stub field will remain for
+  compatibility with historical migrations.
+
 See the :ref:`Django 3.1 release notes <deprecated-features-3.1>` for more
 details on these changes.
 

+ 2 - 0
docs/ref/checks.txt

@@ -202,6 +202,8 @@ Model fields
   in historical migrations.
 * **fields.W902**: ``FloatRangeField`` is deprecated and will be removed in
   Django 3.1. *This check appeared in Django 2.2 and 3.0*.
+* **fields.W903**: ``NullBooleanField`` is deprecated. Support for it (except
+  in historical migrations) will be removed in Django 4.0.
 
 File fields
 ~~~~~~~~~~~

+ 5 - 2
docs/ref/models/fields.txt

@@ -1182,8 +1182,11 @@ values are stored as null.
 
 .. class:: NullBooleanField(**options)
 
-Like :class:`BooleanField` with ``null=True``. Use that instead of this field
-as it's likely to be deprecated in a future version of Django.
+Like :class:`BooleanField` with ``null=True``.
+
+.. deprecated:: 3.1
+
+    ``NullBooleanField`` is deprecated in favor of ``BooleanField(null=True)``.
 
 ``PositiveBigIntegerField``
 ---------------------------

+ 3 - 0
docs/releases/3.1.txt

@@ -733,6 +733,9 @@ Miscellaneous
   same result can be achieved by passing aliases in a
   :class:`~django.db.models.expressions.RawSQL` instead beforehand.
 
+* The ``NullBooleanField`` model field is deprecated in favor of
+  ``BooleanField(null=True)``.
+
 .. _removed-features-3.1:
 
 Features removed in 3.1

+ 15 - 0
tests/invalid_models_tests/test_deprecated_fields.py

@@ -37,3 +37,18 @@ class DeprecatedFieldsTests(SimpleTestCase):
                 id='fields.E901',
             )],
         )
+
+    def test_nullbooleanfield_deprecated(self):
+        class NullBooleanFieldModel(models.Model):
+            nb = models.NullBooleanField()
+
+        model = NullBooleanFieldModel()
+        self.assertEqual(model.check(), [
+            checks.Warning(
+                'NullBooleanField is deprecated. Support for it (except in '
+                'historical migrations) will be removed in Django 4.0.',
+                hint='Use BooleanField(null=True) instead.',
+                obj=NullBooleanFieldModel._meta.get_field('nb'),
+                id='fields.W903',
+            ),
+        ])

+ 1 - 0
tests/runtests.py

@@ -181,6 +181,7 @@ def setup(verbosity, test_labels, parallel, start_at, start_after):
     settings.LOGGING = log_config
     settings.SILENCED_SYSTEM_CHECKS = [
         'fields.W342',  # ForeignKey(unique=True) -> OneToOneField
+        'fields.W903',  # NullBooleanField deprecated.
     ]
 
     # Load all the ALWAYS_INSTALLED_APPS.