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 Jacob Walls, 11 hours ago

Owner: set to VIZZARD-X
Status: newassigned
Triage Stage: UnreviewedAccepted

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.

comment:3 by VIZZARD-X, 9 hours ago

Has patch: set

comment:4 by Jacob Walls, 8 hours ago

Patch needs improvement: set
Version: 6.0dev
Note: See TracTickets for help on using tickets.
Back to Top