Skip to content

Commit 08fd64f

Browse files
committed
add support for order_by() on related collections
1 parent 6801a04 commit 08fd64f

File tree

3 files changed

+17
-20
lines changed

3 files changed

+17
-20
lines changed

.github/workflows/test-python.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ jobs:
4747
uses: actions/checkout@v4
4848
with:
4949
repository: 'mongodb-forks/django'
50-
ref: 'mongodb-5.0.x'
50+
ref: 'related-ordering'
5151
path: 'django_repo'
5252
- name: Install system packages for Django's Python test dependencies
5353
run: |

django_mongodb/compiler.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -205,8 +205,6 @@ def _get_ordering(self):
205205

206206
column_ordering = []
207207
for order in ordering:
208-
if LOOKUP_SEP in order:
209-
raise NotSupportedError("Ordering can't span tables on MongoDB (%s)." % order)
210208
if order == "?":
211209
raise NotSupportedError("Randomized ordering isn't supported by MongoDB.")
212210

@@ -218,11 +216,15 @@ def _get_ordering(self):
218216
if name == "pk":
219217
name = opts.pk.name
220218

221-
try:
222-
column = opts.get_field(name).column
223-
except FieldDoesNotExist:
224-
# `name` is an annotation in $project.
225-
column = name
219+
if LOOKUP_SEP in order:
220+
orderby, _ = self.find_ordering_name(order, self.query.get_meta())[0]
221+
column = orderby.expression.as_mql(self, self.connection).removeprefix("$")
222+
else:
223+
try:
224+
column = opts.get_field(name).column
225+
except FieldDoesNotExist:
226+
# `name` is an annotation in $project.
227+
column = name
226228
column_ordering.append((column, ascending))
227229
return column_ordering
228230

django_mongodb/features.py

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,13 @@ class DatabaseFeatures(BaseDatabaseFeatures):
137137
# QuerySet.explain() not implemented:
138138
# https://github.com/mongodb-labs/django-mongodb/issues/28
139139
"queries.test_explain.ExplainUnsupportedTests.test_message",
140+
# Ordering by related transform not supported.
141+
"queries.tests.Queries1Tests.test_order_by_related_field_transform",
142+
# Ordering on a related field should use the remote model's default
143+
# ordering as a final step.
144+
"queries.tests.Queries1Tests.test_tickets_2076_7256",
145+
# filter() on related model + update() doesn't work.
146+
"queries.tests.Queries5Tests.test_ticket9848",
140147
}
141148
# $bitAnd, #bitOr, and $bitXor are new in MongoDB 6.3.
142149
_django_test_expected_failures_bitwise = {
@@ -612,18 +619,6 @@ def django_test_expected_failures(self):
612619
"Randomized ordering isn't supported by MongoDB.": {
613620
"ordering.tests.OrderingTests.test_random_ordering",
614621
},
615-
# https://github.com/mongodb-labs/django-mongodb/issues/34
616-
"Ordering can't span tables on MongoDB": {
617-
"queries.tests.ConditionalTests.test_infinite_loop",
618-
"queries.tests.NullableRelOrderingTests.test_join_already_in_query",
619-
"queries.tests.Queries1Tests.test_order_by_related_field_transform",
620-
"queries.tests.Queries1Tests.test_ticket7181",
621-
"queries.tests.Queries1Tests.test_tickets_2076_7256",
622-
"queries.tests.Queries1Tests.test_tickets_2874_3002",
623-
"queries.tests.Queries5Tests.test_ordering",
624-
"queries.tests.Queries5Tests.test_ticket9848",
625-
"queries.tests.Ticket14056Tests.test_ticket_14056",
626-
},
627622
"Queries without a collection aren't supported on MongoDB.": {
628623
"queries.test_q.QCheckTests",
629624
"queries.test_query.TestQueryNoModel",

0 commit comments

Comments
 (0)