فهرست منبع

Refs #33543 -- Made Expression.asc()/desc() and OrderBy raise ValueError when nulls_first/nulls_last=False is passed.

Per deprecation timeline.
Mariusz Felisiak 2 سال پیش
والد
کامیت
94ad46e9d8
4فایلهای تغییر یافته به همراه10 افزوده شده و 34 حذف شده
  1. 1 12
      django/db/models/expressions.py
  2. 0 10
      docs/ref/models/expressions.txt
  3. 4 0
      docs/releases/5.0.txt
  4. 5 12
      tests/expressions/tests.py

+ 1 - 12
django/db/models/expressions.py

@@ -2,7 +2,6 @@ import copy
 import datetime
 import functools
 import inspect
-import warnings
 from collections import defaultdict
 from decimal import Decimal
 from uuid import UUID
@@ -13,7 +12,6 @@ from django.db.models import fields
 from django.db.models.constants import LOOKUP_SEP
 from django.db.models.query_utils import Q
 from django.utils.deconstruct import deconstructible
-from django.utils.deprecation import RemovedInDjango50Warning
 from django.utils.functional import cached_property
 from django.utils.hashable import make_hashable
 
@@ -1571,16 +1569,7 @@ class OrderBy(Expression):
         if nulls_first and nulls_last:
             raise ValueError("nulls_first and nulls_last are mutually exclusive")
         if nulls_first is False or nulls_last is False:
-            # When the deprecation ends, replace with:
-            # raise ValueError(
-            #     "nulls_first and nulls_last values must be True or None."
-            # )
-            warnings.warn(
-                "Passing nulls_first=False or nulls_last=False is deprecated, use None "
-                "instead.",
-                RemovedInDjango50Warning,
-                stacklevel=2,
-            )
+            raise ValueError("nulls_first and nulls_last values must be True or None.")
         self.nulls_first = nulls_first
         self.nulls_last = nulls_last
         self.descending = descending

+ 0 - 10
docs/ref/models/expressions.txt

@@ -1063,11 +1063,6 @@ calling the appropriate methods on the wrapped expression.
         ``nulls_first`` and ``nulls_last`` define how null values are sorted.
         See :ref:`using-f-to-sort-null-values` for example usage.
 
-        .. deprecated:: 4.1
-
-            Passing ``nulls_first=False`` or ``nulls_last=False`` to ``asc()``
-            is deprecated. Use ``None`` instead.
-
     .. method:: desc(nulls_first=None, nulls_last=None)
 
         Returns the expression ready to be sorted in descending order.
@@ -1075,11 +1070,6 @@ calling the appropriate methods on the wrapped expression.
         ``nulls_first`` and ``nulls_last`` define how null values are sorted.
         See :ref:`using-f-to-sort-null-values` for example usage.
 
-        .. deprecated:: 4.1
-
-            Passing ``nulls_first=False`` or ``nulls_last=False`` to ``desc()``
-            is deprecated. Use ``None`` instead.
-
     .. method:: reverse_ordering()
 
         Returns ``self`` with any modifications required to reverse the sort

+ 4 - 0
docs/releases/5.0.txt

@@ -347,3 +347,7 @@ to remove usage of these features.
   ``"django/forms/formsets/default.html"`` templates are removed.
 
 * The default form and formset rendering style is changed to the div-based.
+
+* Passing ``nulls_first=False`` or ``nulls_last=False`` to ``Expression.asc()``
+  and ``Expression.desc()`` methods, and the ``OrderBy`` expression is no
+  longer allowed.

+ 5 - 12
tests/expressions/tests.py

@@ -70,7 +70,6 @@ from django.test.utils import (
     isolate_apps,
     register_lookup,
 )
-from django.utils.deprecation import RemovedInDjango50Warning
 from django.utils.functional import SimpleLazyObject
 
 from .models import (
@@ -2632,18 +2631,12 @@ class OrderByTests(SimpleTestCase):
         )
 
     def test_nulls_false(self):
-        # These tests will catch ValueError in Django 5.0 when passing False to
-        # nulls_first and nulls_last becomes forbidden.
-        # msg = "nulls_first and nulls_last values must be True or None."
-        msg = (
-            "Passing nulls_first=False or nulls_last=False is deprecated, use None "
-            "instead."
-        )
-        with self.assertRaisesMessage(RemovedInDjango50Warning, msg):
+        msg = "nulls_first and nulls_last values must be True or None."
+        with self.assertRaisesMessage(ValueError, msg):
             OrderBy(F("field"), nulls_first=False)
-        with self.assertRaisesMessage(RemovedInDjango50Warning, msg):
+        with self.assertRaisesMessage(ValueError, msg):
             OrderBy(F("field"), nulls_last=False)
-        with self.assertRaisesMessage(RemovedInDjango50Warning, msg):
+        with self.assertRaisesMessage(ValueError, msg):
             F("field").asc(nulls_first=False)
-        with self.assertRaisesMessage(RemovedInDjango50Warning, msg):
+        with self.assertRaisesMessage(ValueError, msg):
             F("field").desc(nulls_last=False)