Merge branch 'master' into 391
This commit is contained in:
commit
1785ced655
@ -49,6 +49,11 @@ Querying
|
|||||||
|
|
||||||
.. automethod:: mongoengine.queryset.QuerySet.__call__
|
.. automethod:: mongoengine.queryset.QuerySet.__call__
|
||||||
|
|
||||||
|
.. autoclass:: mongoengine.queryset.QuerySetNoCache
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automethod:: mongoengine.queryset.QuerySetNoCache.__call__
|
||||||
|
|
||||||
.. autofunction:: mongoengine.queryset.queryset_manager
|
.. autofunction:: mongoengine.queryset.queryset_manager
|
||||||
|
|
||||||
Fields
|
Fields
|
||||||
|
@ -4,7 +4,8 @@ Changelog
|
|||||||
|
|
||||||
Changes in 0.8.3
|
Changes in 0.8.3
|
||||||
================
|
================
|
||||||
- Fixed sum and average mapreduce dot notation support (#375, #376)
|
- Added QuerySetNoCache and QuerySet.no_cache() for lower memory consumption (#365)
|
||||||
|
- Fixed sum and average mapreduce dot notation support (#375, #376, #393)
|
||||||
- Fixed as_pymongo to return the id (#386)
|
- Fixed as_pymongo to return the id (#386)
|
||||||
- Document.select_related() now respects `db_alias` (#377)
|
- Document.select_related() now respects `db_alias` (#377)
|
||||||
- Reload uses shard_key if applicable (#384)
|
- Reload uses shard_key if applicable (#384)
|
||||||
|
@ -16,7 +16,9 @@ fetch documents from the database::
|
|||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
As of MongoEngine 0.8 the querysets utilise a local cache. So iterating
|
As of MongoEngine 0.8 the querysets utilise a local cache. So iterating
|
||||||
it multiple times will only cause a single query.
|
it multiple times will only cause a single query. If this is not the
|
||||||
|
desired behavour you can call :class:`~mongoengine.QuerySet.no_cache` to
|
||||||
|
return a non-caching queryset.
|
||||||
|
|
||||||
Filtering queries
|
Filtering queries
|
||||||
=================
|
=================
|
||||||
|
@ -160,7 +160,7 @@ class BaseDocument(object):
|
|||||||
'_fields_ordered', '_dynamic_fields'):
|
'_fields_ordered', '_dynamic_fields'):
|
||||||
if k in data:
|
if k in data:
|
||||||
setattr(self, k, data[k])
|
setattr(self, k, data[k])
|
||||||
for k in data.get('_dynamic_fields').keys():
|
for k in data.get('_dynamic_fields', SON()).keys():
|
||||||
setattr(self, k, data["_data"].get(k))
|
setattr(self, k, data["_data"].get(k))
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
|
@ -279,14 +279,14 @@ class DecimalField(BaseField):
|
|||||||
:param precision: Number of decimal places to store.
|
:param precision: Number of decimal places to store.
|
||||||
:param rounding: The rounding rule from the python decimal libary:
|
:param rounding: The rounding rule from the python decimal libary:
|
||||||
|
|
||||||
- decimial.ROUND_CEILING (towards Infinity)
|
- decimal.ROUND_CEILING (towards Infinity)
|
||||||
- decimial.ROUND_DOWN (towards zero)
|
- decimal.ROUND_DOWN (towards zero)
|
||||||
- decimial.ROUND_FLOOR (towards -Infinity)
|
- decimal.ROUND_FLOOR (towards -Infinity)
|
||||||
- decimial.ROUND_HALF_DOWN (to nearest with ties going towards zero)
|
- decimal.ROUND_HALF_DOWN (to nearest with ties going towards zero)
|
||||||
- decimial.ROUND_HALF_EVEN (to nearest with ties going to nearest even integer)
|
- decimal.ROUND_HALF_EVEN (to nearest with ties going to nearest even integer)
|
||||||
- decimial.ROUND_HALF_UP (to nearest with ties going away from zero)
|
- decimal.ROUND_HALF_UP (to nearest with ties going away from zero)
|
||||||
- decimial.ROUND_UP (away from zero)
|
- decimal.ROUND_UP (away from zero)
|
||||||
- decimial.ROUND_05UP (away from zero if last digit after rounding towards zero would have been 0 or 5; otherwise towards zero)
|
- decimal.ROUND_05UP (away from zero if last digit after rounding towards zero would have been 0 or 5; otherwise towards zero)
|
||||||
|
|
||||||
Defaults to: ``decimal.ROUND_HALF_UP``
|
Defaults to: ``decimal.ROUND_HALF_UP``
|
||||||
|
|
||||||
|
1479
mongoengine/queryset/base.py
Normal file
1479
mongoengine/queryset/base.py
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -2246,6 +2246,145 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
self.Person(name='weightless person').save()
|
self.Person(name='weightless person').save()
|
||||||
self.assertEqual(int(self.Person.objects.sum('age')), sum(ages))
|
self.assertEqual(int(self.Person.objects.sum('age')), sum(ages))
|
||||||
|
|
||||||
|
def test_embedded_average(self):
|
||||||
|
class Pay(EmbeddedDocument):
|
||||||
|
value = DecimalField()
|
||||||
|
|
||||||
|
class Doc(Document):
|
||||||
|
name = StringField()
|
||||||
|
pay = EmbeddedDocumentField(
|
||||||
|
Pay)
|
||||||
|
|
||||||
|
Doc.drop_collection()
|
||||||
|
|
||||||
|
Doc(name=u"Wilson Junior",
|
||||||
|
pay=Pay(value=150)).save()
|
||||||
|
|
||||||
|
Doc(name=u"Isabella Luanna",
|
||||||
|
pay=Pay(value=530)).save()
|
||||||
|
|
||||||
|
Doc(name=u"Tayza mariana",
|
||||||
|
pay=Pay(value=165)).save()
|
||||||
|
|
||||||
|
Doc(name=u"Eliana Costa",
|
||||||
|
pay=Pay(value=115)).save()
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
Doc.objects.average('pay.value'),
|
||||||
|
240)
|
||||||
|
|
||||||
|
def test_embedded_array_average(self):
|
||||||
|
class Pay(EmbeddedDocument):
|
||||||
|
values = ListField(DecimalField())
|
||||||
|
|
||||||
|
class Doc(Document):
|
||||||
|
name = StringField()
|
||||||
|
pay = EmbeddedDocumentField(
|
||||||
|
Pay)
|
||||||
|
|
||||||
|
Doc.drop_collection()
|
||||||
|
|
||||||
|
Doc(name=u"Wilson Junior",
|
||||||
|
pay=Pay(values=[150, 100])).save()
|
||||||
|
|
||||||
|
Doc(name=u"Isabella Luanna",
|
||||||
|
pay=Pay(values=[530, 100])).save()
|
||||||
|
|
||||||
|
Doc(name=u"Tayza mariana",
|
||||||
|
pay=Pay(values=[165, 100])).save()
|
||||||
|
|
||||||
|
Doc(name=u"Eliana Costa",
|
||||||
|
pay=Pay(values=[115, 100])).save()
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
Doc.objects.average('pay.values'),
|
||||||
|
170)
|
||||||
|
|
||||||
|
def test_array_average(self):
|
||||||
|
class Doc(Document):
|
||||||
|
values = ListField(DecimalField())
|
||||||
|
|
||||||
|
Doc.drop_collection()
|
||||||
|
|
||||||
|
Doc(values=[150, 100]).save()
|
||||||
|
Doc(values=[530, 100]).save()
|
||||||
|
Doc(values=[165, 100]).save()
|
||||||
|
Doc(values=[115, 100]).save()
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
Doc.objects.average('values'),
|
||||||
|
170)
|
||||||
|
|
||||||
|
def test_embedded_sum(self):
|
||||||
|
class Pay(EmbeddedDocument):
|
||||||
|
value = DecimalField()
|
||||||
|
|
||||||
|
class Doc(Document):
|
||||||
|
name = StringField()
|
||||||
|
pay = EmbeddedDocumentField(
|
||||||
|
Pay)
|
||||||
|
|
||||||
|
Doc.drop_collection()
|
||||||
|
|
||||||
|
Doc(name=u"Wilson Junior",
|
||||||
|
pay=Pay(value=150)).save()
|
||||||
|
|
||||||
|
Doc(name=u"Isabella Luanna",
|
||||||
|
pay=Pay(value=530)).save()
|
||||||
|
|
||||||
|
Doc(name=u"Tayza mariana",
|
||||||
|
pay=Pay(value=165)).save()
|
||||||
|
|
||||||
|
Doc(name=u"Eliana Costa",
|
||||||
|
pay=Pay(value=115)).save()
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
Doc.objects.sum('pay.value'),
|
||||||
|
960)
|
||||||
|
|
||||||
|
|
||||||
|
def test_embedded_array_sum(self):
|
||||||
|
class Pay(EmbeddedDocument):
|
||||||
|
values = ListField(DecimalField())
|
||||||
|
|
||||||
|
class Doc(Document):
|
||||||
|
name = StringField()
|
||||||
|
pay = EmbeddedDocumentField(
|
||||||
|
Pay)
|
||||||
|
|
||||||
|
Doc.drop_collection()
|
||||||
|
|
||||||
|
Doc(name=u"Wilson Junior",
|
||||||
|
pay=Pay(values=[150, 100])).save()
|
||||||
|
|
||||||
|
Doc(name=u"Isabella Luanna",
|
||||||
|
pay=Pay(values=[530, 100])).save()
|
||||||
|
|
||||||
|
Doc(name=u"Tayza mariana",
|
||||||
|
pay=Pay(values=[165, 100])).save()
|
||||||
|
|
||||||
|
Doc(name=u"Eliana Costa",
|
||||||
|
pay=Pay(values=[115, 100])).save()
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
Doc.objects.sum('pay.values'),
|
||||||
|
1360)
|
||||||
|
|
||||||
|
def test_array_sum(self):
|
||||||
|
class Doc(Document):
|
||||||
|
values = ListField(DecimalField())
|
||||||
|
|
||||||
|
Doc.drop_collection()
|
||||||
|
|
||||||
|
Doc(values=[150, 100]).save()
|
||||||
|
Doc(values=[530, 100]).save()
|
||||||
|
Doc(values=[165, 100]).save()
|
||||||
|
Doc(values=[115, 100]).save()
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
Doc.objects.sum('values'),
|
||||||
|
1360)
|
||||||
|
|
||||||
def test_distinct(self):
|
def test_distinct(self):
|
||||||
"""Ensure that the QuerySet.distinct method works.
|
"""Ensure that the QuerySet.distinct method works.
|
||||||
"""
|
"""
|
||||||
@ -3254,7 +3393,7 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
User(name="Barack Obama", age=51, price=Decimal('2.22')).save()
|
User(name="Barack Obama", age=51, price=Decimal('2.22')).save()
|
||||||
|
|
||||||
results = User.objects.only('id', 'name').as_pymongo()
|
results = User.objects.only('id', 'name').as_pymongo()
|
||||||
self.assertEqual(results[0].keys(), ['_id', 'name'])
|
self.assertEqual(sorted(results[0].keys()), sorted(['_id', 'name']))
|
||||||
|
|
||||||
users = User.objects.only('name', 'price').as_pymongo()
|
users = User.objects.only('name', 'price').as_pymongo()
|
||||||
results = list(users)
|
results = list(users)
|
||||||
@ -3365,6 +3504,34 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
self.assertEqual("%s" % users, "[<User: Bob>]")
|
self.assertEqual("%s" % users, "[<User: Bob>]")
|
||||||
self.assertEqual(1, len(users._result_cache))
|
self.assertEqual(1, len(users._result_cache))
|
||||||
|
|
||||||
|
def test_no_cache(self):
|
||||||
|
"""Ensure you can add meta data to file"""
|
||||||
|
|
||||||
|
class Noddy(Document):
|
||||||
|
fields = DictField()
|
||||||
|
|
||||||
|
Noddy.drop_collection()
|
||||||
|
for i in xrange(100):
|
||||||
|
noddy = Noddy()
|
||||||
|
for j in range(20):
|
||||||
|
noddy.fields["key"+str(j)] = "value "+str(j)
|
||||||
|
noddy.save()
|
||||||
|
|
||||||
|
docs = Noddy.objects.no_cache()
|
||||||
|
|
||||||
|
counter = len([1 for i in docs])
|
||||||
|
self.assertEquals(counter, 100)
|
||||||
|
|
||||||
|
self.assertEquals(len(list(docs)), 100)
|
||||||
|
self.assertRaises(TypeError, lambda: len(docs))
|
||||||
|
|
||||||
|
with query_counter() as q:
|
||||||
|
self.assertEqual(q, 0)
|
||||||
|
list(docs)
|
||||||
|
self.assertEqual(q, 1)
|
||||||
|
list(docs)
|
||||||
|
self.assertEqual(q, 2)
|
||||||
|
|
||||||
def test_nested_queryset_iterator(self):
|
def test_nested_queryset_iterator(self):
|
||||||
# Try iterating the same queryset twice, nested.
|
# Try iterating the same queryset twice, nested.
|
||||||
names = ['Alice', 'Bob', 'Chuck', 'David', 'Eric', 'Francis', 'George']
|
names = ['Alice', 'Bob', 'Chuck', 'David', 'Eric', 'Francis', 'George']
|
||||||
|
Loading…
x
Reference in New Issue
Block a user