diff options
| -rw-r--r-- | django/db/models/sql/query.py | 17 | ||||
| -rw-r--r-- | tests/aggregation_regress/tests.py | 8 |
2 files changed, 17 insertions, 8 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 8be560856b..45192b7809 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -2376,14 +2376,15 @@ class Query(BaseExpression): return True # Don't pollute the original query (might disrupt joins). q = self.clone() - order_by_set = { - ( - order_by.resolve_expression(q) - if hasattr(order_by, "resolve_expression") - else F(order_by).resolve_expression(q) - ) - for order_by in q.order_by - } + order_by_set = set() + for order_by in q.order_by: + if hasattr(order_by, "resolve_expression"): + order_by_set.add(order_by.resolve_expression(q)) + elif order_by == "?": + # Random ordering can't be compared against group by. + return False + else: + order_by_set.add(F(order_by.removeprefix("-")).resolve_expression(q)) return order_by_set.issubset(self.group_by) def clear_ordering(self, force=False, clear_default=True): diff --git a/tests/aggregation_regress/tests.py b/tests/aggregation_regress/tests.py index 33763d589b..f2ed13420f 100644 --- a/tests/aggregation_regress/tests.py +++ b/tests/aggregation_regress/tests.py @@ -188,6 +188,14 @@ class AggregationTests(TestCase): ) self.assertEqual(qs.order_by("id").count(), len(qs.order_by("id"))) self.assertEqual(qs.extra(order_by=["id"]).count(), len(qs.order_by("id"))) + self.assertEqual(qs.order_by("-id").count(), len(qs.order_by("-id"))) + self.assertEqual( + qs.order_by("-publications").count(), len(qs.order_by("-publications")) + ) + self.assertEqual( + qs.order_by("-contact__name").count(), len(qs.order_by("-contact__name")) + ) + self.assertEqual(qs.order_by("?").count(), len(qs.order_by("?"))) def test_annotation_with_value(self): values = ( |
