From 1978dc80eb65025290d81e79a46222bc4ea54696 Mon Sep 17 00:00:00 2001 From: Loic Raucy Date: Thu, 17 Oct 2013 16:26:19 +0200 Subject: [PATCH 1/2] Added regression test for bug with DictField and numeric keys. When a DictField has numeric fields, BaseDocument._lookup_field doesn't work correclty. --- tests/queryset/queryset.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/queryset/queryset.py b/tests/queryset/queryset.py index b4bcf2a7..73178cca 100644 --- a/tests/queryset/queryset.py +++ b/tests/queryset/queryset.py @@ -3367,6 +3367,17 @@ class QuerySetTest(unittest.TestCase): self.assertEqual(1, MyDoc.objects.update_one(upsert=True, inc__47=1)) self.assertEqual(MyDoc.objects.get()['47'], 1) + def test_dictfield_key_looks_like_a_digit(self): + """Only should work with DictField even if they have numeric keys.""" + + class MyDoc(Document): + test = DictField() + + MyDoc.drop_collection() + doc = MyDoc(test={'47': 1}) + doc.save() + self.assertEqual(MyDoc.objects.only('test__47').get().test['47'], 1) + def test_read_preference(self): class Bar(Document): pass From 9ed138f896baf7ecef2f941da92de3ab6e831c91 Mon Sep 17 00:00:00 2001 From: Loic Raucy Date: Thu, 17 Oct 2013 16:32:47 +0200 Subject: [PATCH 2/2] Fixed bug with numeric valuedict keys and BaseDocument._lookup_field(). --- mongoengine/base/document.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mongoengine/base/document.py b/mongoengine/base/document.py index cea2f09b..86838226 100644 --- a/mongoengine/base/document.py +++ b/mongoengine/base/document.py @@ -755,6 +755,9 @@ class BaseDocument(object): """Lookup a field based on its attribute and return a list containing the field's parents and the field. """ + + from mongoengine.fields import ListField + if not isinstance(parts, (list, tuple)): parts = [parts] fields = [] @@ -762,7 +765,7 @@ class BaseDocument(object): for field_name in parts: # Handle ListField indexing: - if field_name.isdigit() and hasattr(field, 'field'): + if field_name.isdigit() and isinstance(field, ListField): new_field = field.field fields.append(field_name) continue