Refs #14357 -- Updated docs about interaction between aggregations and QuerySet.order_by().

Obsolete since 0ddb4ebf7b.
This commit is contained in:
Mariusz Felisiak 2021-06-08 16:39:00 +02:00 committed by GitHub
parent faba5b702a
commit fcd44b889f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 15 additions and 19 deletions

View File

@ -505,15 +505,14 @@ include the aggregate column.
.. _aggregation-ordering-interaction: .. _aggregation-ordering-interaction:
Interaction with default ordering or ``order_by()`` Interaction with ``order_by()``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Fields that are mentioned in the ``order_by()`` part of a queryset (or which Fields that are mentioned in the ``order_by()`` part of a queryset are used
are used in the default ordering on a model) are used when selecting the when selecting the output data, even if they are not otherwise specified in the
output data, even if they are not otherwise specified in the ``values()`` ``values()`` call. These extra fields are used to group "like" results together
call. These extra fields are used to group "like" results together and they and they can make otherwise identical result rows appear to be separate. This
can make otherwise identical result rows appear to be separate. This shows up, shows up, particularly, when counting things.
particularly, when counting things.
By way of example, suppose you have a model like this:: By way of example, suppose you have a model like this::
@ -523,23 +522,20 @@ By way of example, suppose you have a model like this::
name = models.CharField(max_length=10) name = models.CharField(max_length=10)
data = models.IntegerField() data = models.IntegerField()
class Meta: If you want to count how many times each distinct ``data`` value appears in an
ordering = ["name"] ordered queryset, you might try this::
The important part here is the default ordering on the ``name`` field. If you
want to count how many times each distinct ``data`` value appears, you might
try this::
items = Item.objects.order_by('name')
# Warning: not quite correct! # Warning: not quite correct!
Item.objects.values("data").annotate(Count("id")) items.values('data').annotate(Count('id'))
...which will group the ``Item`` objects by their common ``data`` values and ...which will group the ``Item`` objects by their common ``data`` values and
then count the number of ``id`` values in each group. Except that it won't then count the number of ``id`` values in each group. Except that it won't
quite work. The default ordering by ``name`` will also play a part in the quite work. The ordering by ``name`` will also play a part in the grouping, so
grouping, so this query will group by distinct ``(data, name)`` pairs, which this query will group by distinct ``(data, name)`` pairs, which isn't what you
isn't what you want. Instead, you should construct this queryset:: want. Instead, you should construct this queryset::
Item.objects.values("data").annotate(Count("id")).order_by() items.values('data').annotate(Count('id')).order_by()
...clearing any ordering in the query. You could also order by, say, ``data`` ...clearing any ordering in the query. You could also order by, say, ``data``
without any harmful effects, since that is already playing a role in the without any harmful effects, since that is already playing a role in the