diff --git a/mongoengine/queryset/base.py b/mongoengine/queryset/base.py index f41fed39..0a4b161e 100644 --- a/mongoengine/queryset/base.py +++ b/mongoengine/queryset/base.py @@ -761,13 +761,29 @@ class BaseQuerySet(object): distinct = self._dereference(queryset._cursor.distinct(field), 1, name=field, instance=self._document) - # We may need to cast to the correct type eg. - # ListField(EmbeddedDocumentField) - doc_field = getattr(self._document._fields.get(field), "field", self._document._fields.get(field)) - instance = getattr(doc_field, "document_type", False) + doc_field = self._document._fields.get(field.split('.', 1)[0]) + instance = False + # We may need to cast to the correct type eg. ListField(EmbeddedDocumentField) EmbeddedDocumentField = _import_class('EmbeddedDocumentField') - GenericEmbeddedDocumentField = _import_class( - 'GenericEmbeddedDocumentField') + ListField = _import_class('ListField') + GenericEmbeddedDocumentField = _import_class('GenericEmbeddedDocumentField') + if isinstance(doc_field, ListField): + doc_field = getattr(doc_field, "field", doc_field) + if isinstance(doc_field, (EmbeddedDocumentField, GenericEmbeddedDocumentField)): + instance = getattr(doc_field, "document_type", False) + # handle distinct on subdocuments + if '.' in field: + for field_part in field.split('.')[1:]: + # if looping on embedded document, get the document type instance + if instance and isinstance(doc_field, (EmbeddedDocumentField, GenericEmbeddedDocumentField)): + doc_field = instance + # now get the subdocument + doc_field = getattr(doc_field, field_part, doc_field) + # We may need to cast to the correct type eg. ListField(EmbeddedDocumentField) + if isinstance(doc_field, ListField): + doc_field = getattr(doc_field, "field", doc_field) + if isinstance(doc_field, (EmbeddedDocumentField, GenericEmbeddedDocumentField)): + instance = getattr(doc_field, "document_type", False) if instance and isinstance(doc_field, (EmbeddedDocumentField, GenericEmbeddedDocumentField)): distinct = [instance(**doc) for doc in distinct]