Opened 3 weeks ago
Last modified 37 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: | yes |
| Needs tests: | no | Patch needs improvement: | no |
| 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 (10)
comment:1 by , 3 weeks ago
| Owner: | set to |
|---|---|
| Status: | new → assigned |
| Triage Stage: | Unreviewed → Accepted |
comment:3 by , 3 weeks ago
| Has patch: | set |
|---|
comment:4 by , 3 weeks ago
| Patch needs improvement: | set |
|---|---|
| Version: | 6.0 → dev |
comment:5 by , 2 weeks ago
| Needs tests: | set |
|---|
comment:6 by , 10 days ago
I have updated the PR to address the review feedback regarding test coverage.
comment:7 by , 10 days ago
| Needs tests: | unset |
|---|---|
| Patch needs improvement: | unset |
comment:8 by , 41 hours ago
| Patch needs improvement: | set |
|---|
comment:9 by , 38 hours ago
| Patch needs improvement: | unset |
|---|
comment:10 by , 37 hours ago
| Needs documentation: | set |
|---|
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.