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: | 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 )
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 , 12 years ago
comment:2 by , 12 years ago
Description: | modified (diff) |
---|---|
Triage Stage: | Unreviewed → Design decision needed |
Type: | Uncategorized → New 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.
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).