implemented ability to return instances and not simple dicts for distinct on subdocuments
This commit is contained in:
		| @@ -761,13 +761,29 @@ class BaseQuerySet(object): | |||||||
|             distinct = self._dereference(queryset._cursor.distinct(field), 1, |             distinct = self._dereference(queryset._cursor.distinct(field), 1, | ||||||
|                                          name=field, instance=self._document) |                                          name=field, instance=self._document) | ||||||
|  |  | ||||||
|             # We may need to cast to the correct type eg. |             doc_field = self._document._fields.get(field.split('.', 1)[0]) | ||||||
|             # ListField(EmbeddedDocumentField) |             instance = False | ||||||
|             doc_field = getattr(self._document._fields.get(field), "field", self._document._fields.get(field)) |             # We may need to cast to the correct type eg. ListField(EmbeddedDocumentField) | ||||||
|             instance = getattr(doc_field, "document_type", False) |  | ||||||
|             EmbeddedDocumentField = _import_class('EmbeddedDocumentField') |             EmbeddedDocumentField = _import_class('EmbeddedDocumentField') | ||||||
|             GenericEmbeddedDocumentField = _import_class( |             ListField = _import_class('ListField') | ||||||
|                 'GenericEmbeddedDocumentField') |             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, |             if instance and isinstance(doc_field, (EmbeddedDocumentField, | ||||||
|                                                    GenericEmbeddedDocumentField)): |                                                    GenericEmbeddedDocumentField)): | ||||||
|                 distinct = [instance(**doc) for doc in distinct] |                 distinct = [instance(**doc) for doc in distinct] | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user