#33682: Clarify using distinct() with related fields that have Meta.ordering
defined.
--------------------------------------+------------------------------------
     Reporter:  Robert Leach          |                    Owner:  nobody
         Type:  Cleanup/optimization  |                   Status:  new
    Component:  Documentation         |                  Version:  3.2
     Severity:  Normal                |               Resolution:
     Keywords:  sql, distinct         |             Triage Stage:  Accepted
    Has patch:  0                     |      Needs documentation:  0
  Needs tests:  0                     |  Patch needs improvement:  0
Easy pickings:  0                     |                    UI/UX:  0
--------------------------------------+------------------------------------
Changes (by Mariusz Felisiak):

 * keywords:  sql, distinct, => sql, distinct
 * type:  Bug => Cleanup/optimization
 * component:  Database layer (models, ORM) => Documentation
 * stage:  Unreviewed => Accepted


Comment:

 I tried to clarify this, maybe:
 {{{#!diff
 diff --git a/docs/ref/models/querysets.txt b/docs/ref/models/querysets.txt
 index a9da1dcf7e..7c2c299b58 100644
 --- a/docs/ref/models/querysets.txt
 +++ b/docs/ref/models/querysets.txt
 @@ -554,18 +554,24 @@ Examples (those after the first will only work on
 PostgreSQL)::

  .. note::
      Keep in mind that :meth:`order_by` uses any default related model
 ordering
 -    that has been defined. You might have to explicitly order by the
 relation
 -    ``_id`` or referenced field to make sure the ``DISTINCT ON``
 expressions
 -    match those at the beginning of the ``ORDER BY`` clause. For example,
 if
 -    the ``Blog`` model defined an
 :attr:`~django.db.models.Options.ordering` by
 -    ``name``::
 +    that has been defined in
 +    :attr:`Meta.ordering <django.db.models.Options.ordering>`. As a
 +    consequence, ordering by a related field is resolved to the list of
 fields
 +    defined in a related ``Meta.ordering`` and may not be the same as a
 +    relation ID field used by ``distinct()``. To avoid using
 ``Meta.ordering``
 +    and make sure the ``DISTINCT ON`` expressions match those at the
 beginning
 +    of the ``ORDER BY`` clause, you can explicitly order by the relation
 +    ``_id`` or referenced field. For example, if the ``Blog`` model
 defined an
 +    :attr:`~django.db.models.Options.ordering` by ``name``::

          Entry.objects.order_by('blog').distinct('blog')

      ...wouldn't work because the query would be ordered by ``blog__name``
 thus
      mismatching the ``DISTINCT ON`` expression. You'd have to explicitly
 order
      by the relation ``_id`` field (``blog_id`` in this case) or the
 referenced
 -    one (``blog__pk``) to make sure both expressions match.
 +    one (``blog__pk``) to make sure both expressions match::
 +
 +        Entry.objects.order_by('blog_id').distinct('blog_id')

  ``values()``
  ~~~~~~~~~~~~
 }}}
 What do you think?

-- 
Ticket URL: <https://code.djangoproject.com/ticket/33682#comment:8>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/01070180b6a147d2-3aebc40b-c4c0-47ba-a132-cff0299d93b3-000000%40eu-central-1.amazonses.com.

Reply via email to