BIG FAT DISCLAIMER
I'm not sure this has anything to do with your issue, but it's easy to miss
when reading the docs.


https://docs.djangoproject.com/en/dev/topics/db/aggregation/#interaction-with-default-ordering-or-order-by

If your model has an 'ordering' attribute defined in Meta, make sure you add
a "blank" .order_by()  to your query.


Sincerely,
André Terra


On Tue, Jun 21, 2011 at 10:58 AM, Michał Sawicz <mic...@sawicz.net> wrote:

> Hi all,
>
> I'm not sure it's actually supposed to work, but looks like a common
> enough approach that it should.
>
> Say you have an aggregate query:
> > Model.objects.values('field').annotate(Sum('count'))
> that results in an aggregate query that follows:
> > SELECT "models_model"."field", SUM("models_model"."count") AS
> > "count__sum" FROM "models_model" GROUP BY "models_model"."field"
>
> And that's all fine, but if you want to get additional fields:
> > Model.objects.values('field').annotate(Sum('count')).values('field',
> > 'field2', 'count_sum')
> the additional fields get added to the GROUP BY clause:
> > SELECT "models_model"."field", "models_model"."field2",
> > SUM("models_model"."count") AS "count__sum" FROM "models_model" GROUP
> > BY "models_model"."field", "models_model"."field",
> > "models_model"."field2"
>
> That doesn't, in itself, pose any problems. "field" is added twice, but
> that's probably optimized down within SQL itself. I'm only afraid that
> grouping by "field" and "field2" is slower than grouping by "field" is.
> Maybe my approach here is wrong? What would you do to group by "field",
> annotate with SUM("count") and retrieve "field2", too?
>
> Now, if you want to leverage some more advanced queries:
> > Model.objects.values('field').annotate(Sum('count')).values('field',
> > 'field2', 'count_sum').extra({'value': 'SUM("models_model"."field3" *
> > "models_model"."count")'})
> that breaks with:
> > DatabaseError: aggregate functions are not allowed in the GROUP BY
> > clause
> because the resulting query looks like this:
> > SELECT (SUM("models_model"."field3" * "models_model"."count")) AS
> > "value", "models_model"."field", "models_model"."field2",
> > SUM("models_model"."count") AS "count__sum" FROM "models_model" GROUP
> > BY "models_model"."field", "models_model"."field",
> > "models_model"."field2", (SUM("models_model"."field3" *
> > "models_model"."count"))
> As you can see, the field definitions from extra() gets added to the
> GROUP BY clause, and fails.
> If I drop the last added GROUP BY element (or even all of them, bar
> "field"), the query is working fine, and the results are as expected.
>
> Is this an eccentric enough usecase that I should forget about that? Or
> is my approach simply wrong?
>
> Best regards,
> --
> Michał (Saviq) Sawicz <mic...@sawicz.net>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to