Opened 20 months ago
Last modified 14 months ago
#34551 closed Bug
Case-When aggregation over aggregated fields doesn't work since 4.2 — at Initial Version
Reported by: | Denis Roldán | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 4.2 |
Severity: | Release blocker | Keywords: | aggregate subquery annotation |
Cc: | Simon Charette | Triage Stage: | Ready for checkin |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
This same QuerySet was working on 4.1.X and prior versions and stopped working on 4.2.X:
annotated_users = users_qs.annotate( total_things=Subquery( OtherModel.objects.filter(user_id=OuterRef("pk")).annotate( total_objs=F("total") ).values("total_objs") ) ) annotated_users.aggregate( sum_total_objs=Sum("total_things"), avg_conversion_rate=Case( When( sum_total_objs=0, then=0, ), default=Round( (Sum("sum_total_confirmed_objs") / Sum("sum_total_objs")) * 100, 2 ), output_field=FloatField(), ) )
As you can see sum_total_objs
is an aggregated field that is also used on a second field to calculate the conversion rate. To avoid a zero division problem, we were using a Case-When clause over that field. It works well on any 4.1 and prior versions but stopped working since 4.2, raising a FieldError
like:
Cannot resolve keyword 'sum_total_objs' into field
Thanks for the support!
Note:
See TracTickets
for help on using tickets.