Kaydet (Commit) 62917cee authored tarafından Tomer Chachamu's avatar Tomer Chachamu Kaydeden (comit) Tim Graham

Doc'd the need to remove default ordering on Subquery aggregates.

üst 12812f6b
...@@ -601,15 +601,16 @@ Assuming both models have a ``length`` field, to find posts where the post ...@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment