Opened 7 years ago
Last modified 7 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?