remove ridiculous try-finally clause from BaseQuerySet.distinct
This commit is contained in:
parent
b99985eaf8
commit
756d8b2ac5
@ -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. ::
|
||||||
|
Loading…
x
Reference in New Issue
Block a user