Opened 11 hours ago
Last modified 8 hours ago
#36857 assigned New feature
Add totally_ordered property to QuerySet to check for deterministic ordering
| Reported by: | VIZZARD-X | Owned by: | VIZZARD-X |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | dev |
| Severity: | Normal | Keywords: | ordering |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | yes |
| Easy pickings: | no | UI/UX: | no |
Description
Currently, QuerySet.ordered returns True if any ordering is applied, but this does not guarantee deterministic results. For example, ordering by a non-unique field (like pub_date) is considered "ordered", but the relative order of records with the same date is undefined and database-dependent.
This lack of determinism causes issues in pagination and serialization (specifically for natural keys), where a stable sort order is required to ensure consistency.
I propose adding a property (tentatively totally_ordered) to QuerySet that checks if the applied ordering is sufficient to guarantee a stable sort. This would verify if the order clauses include a unique field (like the primary key) or a set of fields covered by a unique constraint.
Note: Similar logic already exists in django.contrib.admin.views.main.ChangeList.get_ordering. The plan is to extract that logic, make it public/reusable on QuerySet, and document it.
Context: This feature was identified as a requirement for fixing #36750 (deterministic M2M serialization).
Change History (4)
comment:1 by , 11 hours ago
| Owner: | set to |
|---|---|
| Status: | new → assigned |
| Triage Stage: | Unreviewed → Accepted |
comment:3 by , 9 hours ago
| Has patch: | set |
|---|
comment:4 by , 8 hours ago
| Patch needs improvement: | set |
|---|---|
| Version: | 6.0 → dev |
Accepting without taking a trip to django/new-features because it's a requirement for a pending ticket (#36750) that could have been worked on as
Refs #36750, but we decided to explode into a second ticket for clearer discussion.Tentatively assigning to the author of #36750, who I think volunteered to push it forward.