diff --git a/mongoengine/base.py b/mongoengine/base.py index 76a2c0e9..b37edcbf 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -270,6 +270,18 @@ class BaseDocument(object): def __len__(self): return len(self._data) + def __repr__(self): + try: + u = unicode(self) + except (UnicodeEncodeError, UnicodeDecodeError): + u = '[Bad Unicode data]' + return u'<%s: %s>' % (self.__class__.__name__, u) + + def __str__(self): + if hasattr(self, '__unicode__'): + return unicode(self).encode('utf-8') + return '%s object' % self.__class__.__name__ + def to_mongo(self): """Return data dictionary ready for use with MongoDB. """ diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index 2a4f5383..0ebdc67e 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -7,6 +7,9 @@ import copy __all__ = ['queryset_manager', 'Q', 'InvalidQueryError', 'InvalidCollectionError'] +# The maximum number of items to display in a QuerySet.__repr__ +REPR_OUTPUT_SIZE = 20 + class InvalidQueryError(Exception): pass @@ -514,6 +517,11 @@ class QuerySet(object): """ return self.exec_js(freq_func, list_field, normalize=normalize) + def __repr__(self): + data = list(self[:REPR_OUTPUT_SIZE + 1]) + if len(data) > REPR_OUTPUT_SIZE: + data[-1] = "...(remaining elements truncated)..." + return repr(data) class InvalidCollectionError(Exception): pass