Skip to content

Commit 397ce27

Browse files
committed
Fix m2m joins.
1 parent 8330b8f commit 397ce27

File tree

2 files changed

+26
-93
lines changed

2 files changed

+26
-93
lines changed

django_mongodb_backend/query.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,9 @@ def _get_reroot_replacements(expression):
188188
self.parent_alias, lhs, compiler.collection_name, rhs
189189
)
190190
if (
191-
isinstance(lhs, ForeignKey)
192-
and isinstance(lhs_prepared, Col)
193-
and isinstance(rhs_prepared, Col)
191+
(isinstance(lhs, ForeignKey) or isinstance(rhs, ForeignKey))
192+
and lhs_prepared.is_simple_column
193+
and rhs_prepared.is_simple_column
194194
):
195195
local_field = lhs_prepared.as_mql(compiler, connection)
196196
foreign_field = rhs_prepared.as_mql(compiler, connection)

tests/queries_/test_mql.py

Lines changed: 23 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -129,24 +129,10 @@ def test_filter_on_reverse_foreignkey_relation(self):
129129
{
130130
"$lookup": {
131131
"from": "queries__orderitem",
132-
"let": {"parent__field__0": "$_id"},
133-
"pipeline": [
134-
{
135-
"$match": {
136-
"$and": [
137-
{
138-
"$expr": {
139-
"$and": [
140-
{"$eq": ["$$parent__field__0", "$order_id"]}
141-
]
142-
}
143-
},
144-
{"status": ObjectId("6891ff7822e475eddc20f159")},
145-
]
146-
}
147-
}
148-
],
132+
"localField": "_id",
133+
"foreignField": "order_id",
149134
"as": "queries__orderitem",
135+
"pipeline": [{"$match": {"status": ObjectId("6891ff7822e475eddc20f159")}}],
150136
}
151137
},
152138
{"$unwind": "$queries__orderitem"},
@@ -172,24 +158,10 @@ def test_filter_on_local_and_nested_join_fields(self):
172158
{
173159
"$lookup": {
174160
"from": "queries__orderitem",
175-
"pipeline": [
176-
{
177-
"$match": {
178-
"$and": [
179-
{
180-
"$expr": {
181-
"$and": [
182-
{"$eq": ["$$parent__field__0", "$order_id"]}
183-
]
184-
}
185-
},
186-
{"status": ObjectId("6891ff7822e475eddc20f159")},
187-
]
188-
}
189-
}
190-
],
161+
"localField": "_id",
162+
"foreignField": "order_id",
163+
"pipeline": [{"$match": {"status": ObjectId("6891ff7822e475eddc20f159")}}],
191164
"as": "queries__orderitem",
192-
"let": {"parent__field__0": "$_id"},
193165
}
194166
},
195167
{"$unwind": "$queries__orderitem"},
@@ -281,25 +253,14 @@ def test_push_equality_between_parent_and_child_fields(self):
281253
[
282254
{
283255
"$lookup": {
284-
"as": "queries__orderitem",
285256
"from": "queries__orderitem",
286-
"let": {"parent__field__0": "$_id", "parent__field__1": "$_id"},
257+
"let": {"parent__field__0": "$_id"},
287258
"pipeline": [
288-
{
289-
"$match": {
290-
"$and": [
291-
{
292-
"$expr": {
293-
"$and": [
294-
{"$eq": ["$$parent__field__0", "$order_id"]}
295-
]
296-
}
297-
},
298-
{"$expr": {"$eq": ["$status", "$$parent__field__1"]}},
299-
]
300-
}
301-
}
259+
{"$match": {"$expr": {"$eq": ["$status", "$$parent__field__0"]}}}
302260
],
261+
"as": "queries__orderitem",
262+
"localField": "_id",
263+
"foreignField": "order_id",
303264
}
304265
},
305266
{"$unwind": "$queries__orderitem"},
@@ -321,17 +282,10 @@ def test_simple_related_filter_is_pushed(self):
321282
{
322283
"$lookup": {
323284
"from": "queries__library_readers",
324-
"pipeline": [
325-
{
326-
"$match": {
327-
"$expr": {
328-
"$and": [{"$eq": ["$$parent__field__0", "$library_id"]}]
329-
}
330-
}
331-
}
332-
],
285+
"pipeline": [],
333286
"as": "queries__library_readers",
334-
"let": {"parent__field__0": "$_id"},
287+
"localField": "_id",
288+
"foreignField": "library_id",
335289
}
336290
},
337291
{"$unwind": "$queries__library_readers"},
@@ -440,17 +394,10 @@ def test_filter_on_local_and_related_fields(self):
440394
{
441395
"$lookup": {
442396
"from": "queries__library_readers",
443-
"pipeline": [
444-
{
445-
"$match": {
446-
"$expr": {
447-
"$and": [{"$eq": ["$$parent__field__0", "$library_id"]}]
448-
}
449-
}
450-
}
451-
],
397+
"localField": "_id",
398+
"foreignField": "library_id",
399+
"pipeline": [],
452400
"as": "queries__library_readers",
453-
"let": {"parent__field__0": "$_id"},
454401
}
455402
},
456403
{"$unwind": "$queries__library_readers"},
@@ -482,17 +429,10 @@ def test_annotate_foreign_field(self):
482429
{
483430
"$lookup": {
484431
"from": "queries__library_readers",
485-
"pipeline": [
486-
{
487-
"$match": {
488-
"$expr": {
489-
"$and": [{"$eq": ["$$parent__field__0", "$library_id"]}]
490-
}
491-
}
492-
}
493-
],
432+
"localField": "_id",
433+
"foreignField": "library_id",
434+
"pipeline": [],
494435
"as": "queries__library_readers",
495-
"let": {"parent__field__0": "$_id"},
496436
}
497437
},
498438
{
@@ -564,17 +504,10 @@ def test_or_with_mixed_pushable_and_non_pushable_fields(self):
564504
{
565505
"$lookup": {
566506
"from": "queries__library_readers",
567-
"pipeline": [
568-
{
569-
"$match": {
570-
"$expr": {
571-
"$and": [{"$eq": ["$$parent__field__0", "$library_id"]}]
572-
}
573-
}
574-
}
575-
],
507+
"localField": "_id",
508+
"foreignField": "library_id",
509+
"pipeline": [],
576510
"as": "queries__library_readers",
577-
"let": {"parent__field__0": "$_id"},
578511
}
579512
},
580513
{

0 commit comments

Comments
 (0)