From 396da8b94c62cf955ab401eb40a952b7edba0376 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Thu, 7 Jan 2021 20:50:36 +0100 Subject: [PATCH] Refs #30841 -- Made isnull lookup raise ValueError for non-boolean values. Per deprecation timeline. --- django/db/models/lookups.py | 14 +++----------- docs/ref/models/querysets.txt | 5 ----- docs/releases/4.0.txt | 3 +++ tests/lookup/tests.py | 13 ++----------- 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()