Doc'd the need to remove default ordering on Subquery aggregates.
This commit is contained in:
parent
12812f6b2d
commit
62917cee5a
|
@ -601,15 +601,16 @@ Assuming both models have a ``length`` field, to find posts where the post
|
||||||
length is greater than the total length of all combined comments::
|
length is greater than the total length of all combined comments::
|
||||||
|
|
||||||
>>> from django.db.models import OuterRef, Subquery, Sum
|
>>> from django.db.models import OuterRef, Subquery, Sum
|
||||||
>>> comments = Comment.objects.filter(post=OuterRef('pk')).values('post')
|
>>> comments = Comment.objects.filter(post=OuterRef('pk')).order_by().values('post')
|
||||||
>>> total_comments = comments.annotate(total=Sum('length')).values('total')
|
>>> total_comments = comments.annotate(total=Sum('length')).values('total')
|
||||||
>>> Post.objects.filter(length__gt=Subquery(total_comments))
|
>>> Post.objects.filter(length__gt=Subquery(total_comments))
|
||||||
|
|
||||||
The initial ``filter(...)`` limits the subquery to the relevant parameters.
|
The initial ``filter(...)`` limits the subquery to the relevant parameters.
|
||||||
``values('post')`` aggregates comments by ``Post``. Finally, ``annotate(...)``
|
``order_by()`` removes the default :attr:`~django.db.models.Options.ordering`
|
||||||
performs the aggregation. The order in which these queryset methods are applied
|
(if any) on the ``Comment`` model. ``values('post')`` aggregates comments by
|
||||||
is important. In this case, since the subquery must be limited to a single
|
``Post``. Finally, ``annotate(...)`` performs the aggregation. The order in
|
||||||
column, ``values('total')`` is required.
|
which these queryset methods are applied is important. In this case, since the
|
||||||
|
subquery must be limited to a single column, ``values('total')`` is required.
|
||||||
|
|
||||||
This is the only way to perform an aggregation within a ``Subquery``, as
|
This is the only way to perform an aggregation within a ``Subquery``, as
|
||||||
using :meth:`~.QuerySet.aggregate` attempts to evaluate the queryset (and if
|
using :meth:`~.QuerySet.aggregate` attempts to evaluate the queryset (and if
|
||||||
|
|
Loading…
Reference in New Issue