#24692: QuerySet.extra(select=...) is silently dropped with aggregations
-------------------------------------+-------------------------------------
     Reporter:  jdelic               |                    Owner:  nobody
         Type:  Uncategorized        |                   Status:  new
    Component:  Database layer       |                  Version:  1.8
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:
     Keywords:                       |             Triage Stage:
                                     |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------

Comment (by jdelic):

 > Looking at it a bit more, though, I noticed that period doesn't seem to
 be used in the values or in the annotate. Do you have a typo there?

 No, not a typo per se. Maybe a mistake, though. I'm basing this off the
 {{{is_recent}}} example in
 https://docs.djangoproject.com/en/1.8/ref/models/querysets/#extra, which
 also doesn't mention the field anywhere else. It might be worth mentioning
 that if you add {{{.values('service_id', 'period')}}} then the QuerySet
 will generate invalid SQL:

 {{{
 #!python
 >>> qs = ServiceAction.objects.extra(select={'period':
 
'(MAX("dbtest_serviceaction"."performed")-MIN("dbtest_serviceaction"."performed"))'}).values('service_id',
 'period').annotate(first_action=Min('performed'),
 last_action=Max('performed'))
 >>> print(qs.query)
 SELECT
 
((MAX("dbtest_serviceaction"."performed")-MIN("dbtest_serviceaction"."performed")))
 AS "period", "dbtest_serviceaction"."service_id",
 MAX("dbtest_serviceaction"."performed") AS "last_action",
 MIN("dbtest_serviceaction"."performed") AS "first_action" FROM
 "dbtest_serviceaction" GROUP BY "dbtest_serviceaction"."service_id",
 
((MAX("dbtest_serviceaction"."performed")-MIN("dbtest_serviceaction"."performed")))
 >>> qs
 ...
 OperationalError: aggregate functions are not allowed in the GROUP BY
 clause
 }}}

--
Ticket URL: <https://code.djangoproject.com/ticket/24692#comment:7>
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/064.d7e80c38ce0f03681347cf688c7b7e35%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to