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 diff --git a/tests/queryset/queryset.py b/tests/queryset/queryset.py index 4b2ec6b4..d09f19cd 100644 --- a/tests/queryset/queryset.py +++ b/tests/queryset/queryset.py @@ -3388,6 +3388,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