summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2021-01-07 20:50:36 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-01-14 17:50:04 +0100
commit396da8b94c62cf955ab401eb40a952b7edba0376 (patch)
treead78e90e36aa104fefa591cddbfb4f831a0f33da
parent12ac4916af034221a4e08ce6b5669e53a0223a67 (diff)
Refs #30841 -- Made isnull lookup raise ValueError for non-boolean values.
Per deprecation timeline.
-rw-r--r--django/db/models/lookups.py14
-rw-r--r--docs/ref/models/querysets.txt5
-rw-r--r--docs/releases/4.0.txt3
-rw-r--r--tests/lookup/tests.py13
4 files changed, 8 insertions, 27 deletions
diff --git a/django/db/models/lookups.py b/django/db/models/lookups.py
index 43f40c24ec..916478d075 100644
--- a/django/db/models/lookups.py
+++ b/django/db/models/lookups.py
@@ -1,6 +1,5 @@
import itertools
import math
-import warnings
from copy import copy
from django.core.exceptions import EmptyResultSet
@@ -10,7 +9,6 @@ from django.db.models.fields import (
)
from django.db.models.query_utils import RegisterLookupMixin
from django.utils.datastructures import OrderedSet
-from django.utils.deprecation import RemovedInDjango40Warning
from django.utils.functional import cached_property
from django.utils.hashable import make_hashable
@@ -508,15 +506,9 @@ class IsNull(BuiltinLookup):
def as_sql(self, compiler, connection):
if not isinstance(self.rhs, bool):
- # When the deprecation ends, replace with:
- # raise ValueError(
- # 'The QuerySet value for an isnull lookup must be True or '
- # 'False.'
- # )
- warnings.warn(
- 'Using a non-boolean value for an isnull lookup is '
- 'deprecated, use True or False instead.',
- RemovedInDjango40Warning,
+ raise ValueError(
+ 'The QuerySet value for an isnull lookup must be True or '
+ 'False.'
)
sql, params = compiler.compile(self.lhs)
if self.rhs:
diff --git a/docs/ref/models/querysets.txt b/docs/ref/models/querysets.txt
index eca0caf6d6..d09089a55e 100644
--- a/docs/ref/models/querysets.txt
+++ b/docs/ref/models/querysets.txt
@@ -3424,11 +3424,6 @@ SQL equivalent:
SELECT ... WHERE pub_date IS NULL;
-.. deprecated:: 3.1
-
- Using non-boolean values as the right-hand side is deprecated, use ``True``
- or ``False`` instead. In Django 4.0, the exception will be raised.
-
.. fieldlookup:: regex
``regex``
diff --git a/docs/releases/4.0.txt b/docs/releases/4.0.txt
index 3f3d46617e..ba90639928 100644
--- a/docs/releases/4.0.txt
+++ b/docs/releases/4.0.txt
@@ -268,3 +268,6 @@ See :ref:`deprecated-features-3.1` for details on these changes, including how
to remove usage of these features.
* The ``PASSWORD_RESET_TIMEOUT_DAYS`` setting is removed.
+
+* The :lookup:`isnull` lookup no longer allows using non-boolean values as the
+ right-hand side.
diff --git a/tests/lookup/tests.py b/tests/lookup/tests.py
index 9962d34937..548f470523 100644
--- a/tests/lookup/tests.py
+++ b/tests/lookup/tests.py
@@ -9,7 +9,6 @@ from django.db.models import Exists, Max, OuterRef
from django.db.models.functions import Substr
from django.test import TestCase, skipUnlessDBFeature
from django.test.utils import isolate_apps
-from django.utils.deprecation import RemovedInDjango40Warning
from .models import (
Article, Author, Freebie, Game, IsNullWithNoneAsRHS, Player, Season, Tag,
@@ -985,15 +984,7 @@ class LookupTests(TestCase):
self.assertEqual(authors.get(), newest_author)
def test_isnull_non_boolean_value(self):
- # These tests will catch ValueError in Django 4.0 when using
- # non-boolean values for an isnull lookup becomes forbidden.
- # msg = (
- # 'The QuerySet value for an isnull lookup must be True or False.'
- # )
- msg = (
- 'Using a non-boolean value for an isnull lookup is deprecated, '
- 'use True or False instead.'
- )
+ msg = 'The QuerySet value for an isnull lookup must be True or False.'
tests = [
Author.objects.filter(alias__isnull=1),
Article.objects.filter(author__isnull=1),
@@ -1002,5 +993,5 @@ class LookupTests(TestCase):
]
for qs in tests:
with self.subTest(qs=qs):
- with self.assertWarnsMessage(RemovedInDjango40Warning, msg):
+ with self.assertRaisesMessage(ValueError, msg):
qs.exists()