Opened 10 years ago
Closed 10 years ago
#23836 closed Bug (fixed)
aggregate with a sliced queryset doesn't work with relations
Reported by: | Reinout van Rees | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | dev |
Severity: | Normal | Keywords: | |
Cc: | Sander Smits, yitzc | Triage Stage: | Accepted |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
#12886 fixed aggregation for sliced querysets by using subqueries.
This also fixed the GIS "Extent" aggregation for sliced querysets, which was reported in #15101.
While investigating #15101, a test we made failed initially. We noticed however that we were doing an extent aggregation over a relation. So we also made a test for the simple slice+extent() case, which worked.
Aha! Then we made a test similar to the one made to test #12886, but which followed a relation. At least with postgres this resulted in an error: column subquery.num_awards does not exist
.
Traceback (most recent call last): File "/d/dev/repos/django/django/tests/aggregation/tests.py", line 664, in test_aggregation_with_limit_and_relation vals = qs.aggregate(average_num_awards=Avg('publisher__num_awards'))['average_num_awards'] File "/d/dev/repos/django/django/django/db/models/query.py", line 342, in aggregate return query.get_aggregation(using=self.db, force_subq=force_subq) File "/d/dev/repos/django/django/django/db/models/sql/query.py", line 366, in get_aggregation result = compiler.execute_sql(SINGLE) File "/d/dev/repos/django/django/django/db/models/sql/compiler.py", line 817, in execute_sql cursor.execute(sql, params) File "/d/dev/repos/django/django/django/db/backends/utils.py", line 65, in execute return self.cursor.execute(sql, params) File "/d/dev/repos/django/django/django/db/utils.py", line 95, in __exit__ six.reraise(dj_exc_type, dj_exc_value, traceback) File "/d/dev/repos/django/django/django/db/backends/utils.py", line 65, in execute return self.cursor.execute(sql, params) ProgrammingError: column subquery.num_awards does not exist LINE 1: SELECT AVG("subquery"."num_awards") FROM (SELECT "aggregatio...
I don't know how bad this is. Whether it is even supposed to work.
I also don't know how hard to fix it is :-) Might be just a matter of doing AVG("subquery"."publisher"."num_awards")
, so adding the
.publisher
relation name in there.
Pull request with the failing test is upcoming.
Change History (7)
comment:1 by , 10 years ago
Description: | modified (diff) |
---|
comment:2 by , 10 years ago
comment:3 by , 10 years ago
Triage Stage: | Unreviewed → Accepted |
---|
comment:4 by , 10 years ago
Cc: | added |
---|
Hi,
The test from reinout's branch passes against the current master.
Looking at the sql run in the aggregate function seems to properly join the relation, which allows completing the query successfully.
I think it can be closed.
comment:5 by , 10 years ago
It would be nice to bisect to determine the commit where it was fixed to ensure that a sufficient test was added.
comment:7 by , 10 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
The tests that were added there look good to me.
Here is a branch demonstrating the issue with a test: https://github.com/jsmits/django/compare/jsmits_ticket_23836