Opened 10 years ago

Last modified 9 years ago

#23836 closed Bug

aggregate with a sliced queryset doesn't work with relations — at Version 1

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 Reinout van Rees)

#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 (1)

comment:1 by Reinout van Rees, 10 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top