Hi everyone,

First, there was ticket #10461[1] -- a complaint that annotate doesn't work 
well with generic relations. Then, it was documented[2] as not working. But 
then, people continued looking at the ticket, and in the end, it was declared 
as fixed and a test was added[3]. But deeper checking[4] finds that the 
annotation does not do the intuitive thing -- at least when aggregating over 
the related objects themselves (rather than fields on them), the field it uses 
to aggregate on is the relation field (object_id, by default) rather than the 
pk. This is very odd behavior, as the relation field is guaranteed to be equal 
on all child records of a given record -- and equal to the pk of the parent 
record; thus, the only meaningful aggregation is Count().

However, our docs still just claim[5] that aggregations and generic relations 
do not work together. Which, given the findings, seems to be a good 
description. So, what should we do?

-- Error out on any attempt to aggregate over generic relations. This appears 
to be the most correct behavior, but will break working code (either Count 
annotations or code which creates annotations but doesn't actually use them).

-- Fix annotations to use the right field? Is it possible? Do specific fields 
[i.e. Sum('generic_relation__id')] work? 
(I'll try myself, if nobody beats me to it, but it's rather late for me now)

-- Is it possible that annotations work and aggregations don't?

Thanks,
        Shai.


[1] https://code.djangoproject.com/ticket/10461
[2] https://github.com/django/django/commit/d987b378ce
[3] https://github.com/django/django/commit/76da053641
[4] https://github.com/django/django/commit/e8223b889a#commitcomment-8989832
[5] https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#reverse-
generic-relations

Reply via email to