diff --git a/mongoengine/base/fields.py b/mongoengine/base/fields.py index aa16804e..bee02879 100644 --- a/mongoengine/base/fields.py +++ b/mongoengine/base/fields.py @@ -410,8 +410,11 @@ class ObjectIdField(BaseField): """ def to_python(self, value): - if not isinstance(value, ObjectId): - value = ObjectId(value) + try: + if not isinstance(value, ObjectId): + value = ObjectId(value) + except: + pass return value def to_mongo(self, value): diff --git a/tests/queryset/queryset.py b/tests/queryset/queryset.py index 6cbac495..5c721f0b 100644 --- a/tests/queryset/queryset.py +++ b/tests/queryset/queryset.py @@ -4578,6 +4578,13 @@ class QuerySetTest(unittest.TestCase): self.assertEquals(Animal.objects(folded_ears=True).count(), 1) self.assertEquals(Animal.objects(whiskers_length=5.1).count(), 1) + def test_loop_via_invalid_id_does_not_crash(self): + class Person(Document): + name = StringField() + Person.objects.delete() + Person._get_collection().update({"name": "a"}, {"$set": {"_id": ""}}, upsert=True) + for p in Person.objects(): + self.assertEqual(p.name, 'a') if __name__ == '__main__': unittest.main()