Refs #14357 -- Updated docs about interaction between aggregations and QuerySet.order_by().
Obsolete since 0ddb4ebf7b
.
This commit is contained in:
parent
faba5b702a
commit
fcd44b889f
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue