#23836: aggregate with a sliced queryset doesn't work with relations
-------------------------------------+-------------------------------------
Reporter: reinout | Owner: nobody
Type: Bug | Status: new
Component: Database layer | Version: master
(models, ORM) | Resolution:
Severity: Normal | Triage Stage:
Keywords: | Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by reinout):
* needs_better_patch: => 0
* needs_tests: => 0
* needs_docs: => 0
Old description:
> #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.
New description:
#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.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/23836#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/065.7d8bc49adc32dd1bec527e86ba402c8a%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.