mirror of
https://github.com/django/django.git
synced 2025-08-04 10:59:45 +00:00
Fixed #31566 -- Fixed aliases crash when chaining values()/values_list() after annotate() with aggregations and subqueries.
Subquery annotation references must be resolved if they are excluded
from the GROUP BY clause by a following .values() call.
Regression in fb3f034f1c
.
Thanks Makina Corpus for the report.
This commit is contained in:
parent
e536fa5ce1
commit
42c08ee465
3 changed files with 31 additions and 2 deletions
|
@ -1,10 +1,13 @@
|
|||
import datetime
|
||||
from decimal import Decimal
|
||||
from unittest import skipIf
|
||||
|
||||
from django.core.exceptions import FieldDoesNotExist, FieldError
|
||||
from django.db import connection
|
||||
from django.db.models import (
|
||||
BooleanField, CharField, Count, DateTimeField, ExpressionWrapper, F, Func,
|
||||
IntegerField, NullBooleanField, OuterRef, Q, Subquery, Sum, Value,
|
||||
BooleanField, CharField, Count, DateTimeField, Exists, ExpressionWrapper,
|
||||
F, Func, IntegerField, Max, NullBooleanField, OuterRef, Q, Subquery, Sum,
|
||||
Value,
|
||||
)
|
||||
from django.db.models.expressions import RawSQL
|
||||
from django.db.models.functions import Length, Lower
|
||||
|
@ -619,3 +622,16 @@ class NonAggregateAnnotationTestCase(TestCase):
|
|||
total_books=Subquery(long_books_qs, output_field=IntegerField()),
|
||||
).values('name')
|
||||
self.assertCountEqual(publisher_books_qs, [{'name': 'Sams'}, {'name': 'Morgan Kaufmann'}])
|
||||
|
||||
@skipIf(connection.vendor == 'oracle', 'See https://code.djangoproject.com/ticket/31584')
|
||||
def test_annotation_exists_aggregate_values_chaining(self):
|
||||
qs = Book.objects.values('publisher').annotate(
|
||||
has_authors=Exists(Book.authors.through.objects.filter(book=OuterRef('pk'))),
|
||||
max_pubdate=Max('pubdate'),
|
||||
).values_list('max_pubdate', flat=True).order_by('max_pubdate')
|
||||
self.assertCountEqual(qs, [
|
||||
datetime.date(1991, 10, 15),
|
||||
datetime.date(2008, 3, 3),
|
||||
datetime.date(2008, 6, 23),
|
||||
datetime.date(2008, 11, 3),
|
||||
])
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue