Opened 5 years ago

Last modified 5 years ago

#30374 closed Bug

Paginator UnorderedObjectListWarning on union(all=True) of two sorted queries — at Initial Version

Reported by: Rich Rauenzahn Owned by: nobody
Component: Database layer (models, ORM) Version: dev
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

I wonder if this is a case you want to catch and *not* warn about.

In my case, I'm doing this:

haves = MyModel.objects.filter(foreign_relationship=4).order_by('foreign_relationship__value', 'common_key')
havenots = MyModel.objects.exclude(id__in=haves).order_by('common_key')
query = haves.union(havenots, all=True)

I'm using this with a Paginator. The Paginator complains the queries are not ordered, but they actually are (right?) due to the all=True in the union.

Is this a case the warning ought to handle and ignore?

The Django 1.11 source is:

    def _check_object_list_is_ordered(self):
        """
        Warn if self.object_list is unordered (typically a QuerySet).
        """
        ordered = getattr(self.object_list, 'ordered', None)
        if ordered is not None and not ordered:
            obj_list_repr = (
                '{} {}'.format(self.object_list.model, self.object_list.__class__.__name__)
                if hasattr(self.object_list, 'model')
                else '{!r}'.format(self.object_list)
            )
            warnings.warn(
                'Pagination may yield inconsistent results with an unordered '
                'object_list: {}.'.format(obj_list_repr),
                UnorderedObjectListWarning,
                stacklevel=3
            )

Should union(..., all=True) set ordered in the QuerySet? Or maybe should it look and see if all the source queries are ordered and propagate that to the QuerySet union returns?

Change History (0)

Note: See TracTickets for help on using tickets.
Back to Top