diff --git a/django_mongodb_backend/queryset.py b/django_mongodb_backend/queryset.py index c8b351e3..4a2d884d 100644 --- a/django_mongodb_backend/queryset.py +++ b/django_mongodb_backend/queryset.py @@ -93,4 +93,4 @@ def _make_result(self, query): of __iter__(). """ for result in query: - yield tuple(result.values()) + yield tuple(result.get(key) for key in self.queryset.columns) diff --git a/docs/source/releases/5.1.x.rst b/docs/source/releases/5.1.x.rst index 86872c2d..02c2019d 100644 --- a/docs/source/releases/5.1.x.rst +++ b/docs/source/releases/5.1.x.rst @@ -8,6 +8,8 @@ Django MongoDB Backend 5.1.x *Unreleased* - Added support for :doc:`database caching `. +- Fixed ``QuerySet.raw_aggregate()`` field initialization when the document key + order doesn't match the order of the model's fields. 5.1.0 beta 1 ============ diff --git a/tests/raw_query_/test_raw_aggregate.py b/tests/raw_query_/test_raw_aggregate.py index 91e844e6..72cd74d0 100644 --- a/tests/raw_query_/test_raw_aggregate.py +++ b/tests/raw_query_/test_raw_aggregate.py @@ -2,9 +2,10 @@ These tests are adapted from Django's tests/raw_query/tests.py. """ -from datetime import date +from datetime import date, datetime from django.core.exceptions import FieldDoesNotExist +from django.db import connection from django.test import TestCase from django_mongodb_backend.queryset import RawQuerySet @@ -170,6 +171,23 @@ def test_order_handler(self): authors = Author.objects.all() self.assertSuccessfulRawQuery(Author, query, authors) + def test_different_db_key_order(self): + """ + A raw query correctly associates document keys to model fields when the + document key order is different than the order of model fields. + """ + author = Author(first_name="Out of", last_name="Order", dob=datetime(1950, 9, 20)) + # Insert a document with the keys reversed. + connection.database.get_collection(Author._meta.db_table).insert_one( + { + field.name: getattr(author, field.name) + for field in reversed(Author._meta.concrete_fields) + } + ) + query = [] + authors = Author.objects.all() + self.assertSuccessfulRawQuery(Author, query, authors) + def test_query_representation(self): """Test representation of raw query.""" query = [{"$match": {"last_name": "foo"}}]