remove ridiculous try-finally clause from BaseQuerySet.distinct

This commit is contained in:
Stefan Wojcik 2016-12-08 23:44:36 -05:00
parent b99985eaf8
commit 756d8b2ac5

View File

@ -817,39 +817,46 @@ class BaseQuerySet(object):
.. versionchanged:: 0.6 - Improved db_field refrence handling .. versionchanged:: 0.6 - Improved db_field refrence handling
""" """
queryset = self.clone() queryset = self.clone()
try: try:
field = self._fields_to_dbfields([field]).pop() field = self._fields_to_dbfields([field]).pop()
finally: except LookUpError:
distinct = self._dereference(queryset._cursor.distinct(field), 1, pass
name=field, instance=self._document)
doc_field = self._document._fields.get(field.split('.', 1)[0]) distinct = self._dereference(queryset._cursor.distinct(field), 1,
instance = False name=field, instance=self._document)
# We may need to cast to the correct type eg. ListField(EmbeddedDocumentField)
EmbeddedDocumentField = _import_class('EmbeddedDocumentField') doc_field = self._document._fields.get(field.split('.', 1)[0])
ListField = _import_class('ListField') instance = None
GenericEmbeddedDocumentField = _import_class('GenericEmbeddedDocumentField')
if isinstance(doc_field, ListField): # We may need to cast to the correct type eg. ListField(EmbeddedDocumentField)
doc_field = getattr(doc_field, 'field', doc_field) EmbeddedDocumentField = _import_class('EmbeddedDocumentField')
if isinstance(doc_field, (EmbeddedDocumentField, GenericEmbeddedDocumentField)): ListField = _import_class('ListField')
instance = getattr(doc_field, 'document_type', False) GenericEmbeddedDocumentField = _import_class('GenericEmbeddedDocumentField')
# handle distinct on subdocuments if isinstance(doc_field, ListField):
if '.' in field: doc_field = getattr(doc_field, 'field', doc_field)
for field_part in field.split('.')[1:]: if isinstance(doc_field, (EmbeddedDocumentField, GenericEmbeddedDocumentField)):
# if looping on embedded document, get the document type instance instance = getattr(doc_field, 'document_type', None)
if instance and isinstance(doc_field, (EmbeddedDocumentField, GenericEmbeddedDocumentField)):
doc_field = instance # handle distinct on subdocuments
# now get the subdocument if '.' in field:
doc_field = getattr(doc_field, field_part, doc_field) for field_part in field.split('.')[1:]:
# We may need to cast to the correct type eg. ListField(EmbeddedDocumentField) # if looping on embedded document, get the document type instance
if isinstance(doc_field, ListField): if instance and isinstance(doc_field, (EmbeddedDocumentField, GenericEmbeddedDocumentField)):
doc_field = getattr(doc_field, 'field', doc_field) doc_field = instance
if isinstance(doc_field, (EmbeddedDocumentField, GenericEmbeddedDocumentField)): # now get the subdocument
instance = getattr(doc_field, 'document_type', False) doc_field = getattr(doc_field, field_part, doc_field)
if instance and isinstance(doc_field, (EmbeddedDocumentField, # We may need to cast to the correct type eg. ListField(EmbeddedDocumentField)
GenericEmbeddedDocumentField)): if isinstance(doc_field, ListField):
distinct = [instance(**doc) for doc in distinct] doc_field = getattr(doc_field, 'field', doc_field)
return distinct if isinstance(doc_field, (EmbeddedDocumentField, GenericEmbeddedDocumentField)):
instance = getattr(doc_field, 'document_type', None)
if instance and isinstance(doc_field, (EmbeddedDocumentField,
GenericEmbeddedDocumentField)):
distinct = [instance(**doc) for doc in distinct]
return distinct
def only(self, *fields): def only(self, *fields):
"""Load only a subset of this document's fields. :: """Load only a subset of this document's fields. ::