mirror of
https://github.com/django/django.git
synced 2026-02-08 18:39:28 +08:00
Fixed #36644 -- Enabled empty order_by() to avoid pk ordering by first()/last().
This commit is contained in:
committed by
Jacob Walls
parent
087bb9e8f3
commit
6380e3f01e
@@ -1158,7 +1158,7 @@ class QuerySet(AltersData):
|
||||
|
||||
def first(self):
|
||||
"""Return the first object of a query or None if no match is found."""
|
||||
if self.ordered:
|
||||
if self.ordered or not self.query.default_ordering:
|
||||
queryset = self
|
||||
else:
|
||||
self._check_ordering_first_last_queryset_aggregation(method="first")
|
||||
@@ -1171,7 +1171,7 @@ class QuerySet(AltersData):
|
||||
|
||||
def last(self):
|
||||
"""Return the last object of a query or None if no match is found."""
|
||||
if self.ordered:
|
||||
if self.ordered or not self.query.default_ordering:
|
||||
queryset = self.reverse()
|
||||
else:
|
||||
self._check_ordering_first_last_queryset_aggregation(method="last")
|
||||
|
||||
@@ -21,6 +21,14 @@ class Comment(models.Model):
|
||||
likes_count = models.PositiveIntegerField()
|
||||
|
||||
|
||||
class OrderedArticle(models.Model):
|
||||
headline = models.CharField(max_length=100)
|
||||
pub_date = models.DateField()
|
||||
|
||||
class Meta:
|
||||
ordering = ["headline"]
|
||||
|
||||
|
||||
# Ticket #23555 - model with an intentionally broken QuerySet.__iter__ method.
|
||||
|
||||
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
from datetime import datetime
|
||||
from unittest.mock import patch
|
||||
|
||||
from django.db.models import Avg
|
||||
from django.test import TestCase
|
||||
|
||||
from .models import Article, Comment, IndexErrorArticle, Person
|
||||
from .models import Article, Comment, IndexErrorArticle, OrderedArticle, Person
|
||||
|
||||
|
||||
class EarliestOrLatestTests(TestCase):
|
||||
@@ -265,3 +266,30 @@ class TestFirstLast(TestCase):
|
||||
qs.first()
|
||||
with self.assertRaisesMessage(TypeError, msg % "last"):
|
||||
qs.last()
|
||||
|
||||
def test_first_last_empty_order_by_has_no_pk_ordering(self):
|
||||
Article.objects.create(
|
||||
headline="Article 1",
|
||||
pub_date=datetime(2006, 9, 10),
|
||||
expire_date=datetime(2056, 9, 11),
|
||||
)
|
||||
|
||||
qs = Article.objects.order_by()
|
||||
with patch.object(type(qs), "order_by") as mock_order_by:
|
||||
qs.first()
|
||||
mock_order_by.assert_not_called()
|
||||
qs.last()
|
||||
mock_order_by.assert_not_called()
|
||||
|
||||
def test_first_last_empty_order_by_clears_default_ordering(self):
|
||||
OrderedArticle.objects.create(
|
||||
headline="Article 1",
|
||||
pub_date=datetime(2006, 9, 10),
|
||||
)
|
||||
|
||||
qs = OrderedArticle.objects.order_by()
|
||||
with patch.object(type(qs), "order_by") as mock_order_by:
|
||||
qs.first()
|
||||
mock_order_by.assert_not_called()
|
||||
qs.last()
|
||||
mock_order_by.assert_not_called()
|
||||
|
||||
Reference in New Issue
Block a user