Opened 12 years ago

Last modified 12 years ago

#19512 closed New feature

Aggregate or Annotaion on previously Annotated values — at Version 2

Reported by: eye-see-you@… Owned by: nobody
Component: Database layer (models, ORM) Version: 1.4
Severity: Normal Keywords: django, annotate, aggregate
Cc: Triage Stage: Design decision needed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Aymeric Augustin)

from django.db.models import Count, Sum, F

myModel.objects \
               .annotate(a_count=Count('field_a'), b_count=Count('field_b')) \
               .annotate(total=F('a_count')+F('b_count')) \
               .order_by('total')

This query is going to raise AttributeError: 'ExpressionNode' object has no attribute 'split'

I don't find any method in django ORM to support such kind of operations (in which two fields are involved).

Change History (2)

comment:1 by anonymous, 12 years ago

Instead of using .extra

myModel.objects.extra(select={'total': 'Count(field_a)+Count(field_b)'})

The method which I don't want to use because its not cool(violation of ORM concept).

comment:2 by Aymeric Augustin, 12 years ago

Description: modified (diff)
Triage Stage: UnreviewedDesign decision needed
Type: UncategorizedNew feature

The ORM isn't intended to be a complete abstraction to SQL; it's just a shortcut for the most common queries. Dropping to raw SQL (or .extra if you really need to) isn't a violation of the ORM concept; it's part of the ORM concept — at least, as understood in Django.

The docs talk about aggregating annotations, but not about re-annotating annotations. I'm not sure it's possible to support it while keeping the code complexity under control.

Note: See TracTickets for help on using tickets.
Back to Top