mirror of https://github.com/django/django.git
Fixed #18056 - Cleared aggregations on DateQuery.add_date_select
Cleared aggregations on add_date_select method so only distinct dates are returned when dealing with a QuerySet that contained aggregations. That would cause the query set to return repeated dates because it would look for distinct (date kind, aggregation) pairs.
This commit is contained in:
parent
35ddeee455
commit
bebbbb7af0
|
@ -8,6 +8,7 @@ from django.db.models.sql.constants import *
|
||||||
from django.db.models.sql.datastructures import Date
|
from django.db.models.sql.datastructures import Date
|
||||||
from django.db.models.sql.query import Query
|
from django.db.models.sql.query import Query
|
||||||
from django.db.models.sql.where import AND, Constraint
|
from django.db.models.sql.where import AND, Constraint
|
||||||
|
from django.utils.datastructures import SortedDict
|
||||||
from django.utils.functional import Promise
|
from django.utils.functional import Promise
|
||||||
from django.utils.encoding import force_unicode
|
from django.utils.encoding import force_unicode
|
||||||
|
|
||||||
|
@ -205,6 +206,7 @@ class DateQuery(Query):
|
||||||
self.select = [select]
|
self.select = [select]
|
||||||
self.select_fields = [None]
|
self.select_fields = [None]
|
||||||
self.select_related = False # See #7097.
|
self.select_related = False # See #7097.
|
||||||
|
self.aggregates = SortedDict() # See 18056.
|
||||||
self.set_extra_mask([])
|
self.set_extra_mask([])
|
||||||
self.distinct = True
|
self.distinct = True
|
||||||
self.order_by = order == 'ASC' and [1] or [-1]
|
self.order_by = order == 'ASC' and [1] or [-1]
|
||||||
|
|
|
@ -565,3 +565,23 @@ class BaseAggregateTestCase(TestCase):
|
||||||
(Decimal('82.8'), 1),
|
(Decimal('82.8'), 1),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_dates_with_aggregation(self):
|
||||||
|
"""
|
||||||
|
Test that .dates() returns a distinct set of dates when applied to a
|
||||||
|
QuerySet with aggregation.
|
||||||
|
|
||||||
|
Refs #18056. Previously, .dates() would return distinct (date_kind,
|
||||||
|
aggregation) sets, in this case (year, num_authors), so 2008 would be
|
||||||
|
returned twice because there are books from 2008 with a different
|
||||||
|
number of authors.
|
||||||
|
"""
|
||||||
|
dates = Book.objects.annotate(num_authors=Count("authors")).dates('pubdate', 'year')
|
||||||
|
self.assertQuerysetEqual(
|
||||||
|
dates, [
|
||||||
|
"datetime.datetime(1991, 1, 1, 0, 0)",
|
||||||
|
"datetime.datetime(1995, 1, 1, 0, 0)",
|
||||||
|
"datetime.datetime(2007, 1, 1, 0, 0)",
|
||||||
|
"datetime.datetime(2008, 1, 1, 0, 0)"
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue