1
0
mirror of https://github.com/django/django.git synced 2025-10-26 23:26:08 +00:00

[3.1.x] Fixed #31614 -- Fixed aliases ordering by OrderBy() expressions of combined queryset.

Backport of 2aac176e86 from master
This commit is contained in:
Laurent Tramoy
2020-05-26 09:11:11 +02:00
committed by Mariusz Felisiak
parent 114da2d045
commit df88f24b1f
2 changed files with 22 additions and 2 deletions

View File

@@ -1,3 +1,5 @@
import operator
from django.db import DatabaseError, NotSupportedError, connection
from django.db.models import Exists, F, IntegerField, OuterRef, Value
from django.test import TestCase, skipIfDBFeature, skipUnlessDBFeature
@@ -115,6 +117,21 @@ class QuerySetSetOperationTests(TestCase):
qs2 = Number.objects.filter(num__gte=2, num__lte=3)
self.assertNumbersEqual(qs1.union(qs2).order_by(F('num').desc()), [3, 2, 1, 0])
def test_ordering_by_f_expression_and_alias(self):
qs1 = Number.objects.filter(num__lte=1).values(alias=F('other_num'))
qs2 = Number.objects.filter(num__gte=2, num__lte=3).values(alias=F('other_num'))
self.assertQuerysetEqual(
qs1.union(qs2).order_by(F('alias').desc()),
[10, 9, 8, 7],
operator.itemgetter('alias'),
)
Number.objects.create(num=-1)
self.assertQuerysetEqual(
qs1.union(qs2).order_by(F('alias').desc(nulls_last=True)),
[10, 9, 8, 7, None],
operator.itemgetter('alias'),
)
def test_union_with_values(self):
ReservedName.objects.create(name='a', order=2)
qs1 = ReservedName.objects.all()