diff --git a/mongoengine/base/fields.py b/mongoengine/base/fields.py index b3ec0763..5fae2695 100644 --- a/mongoengine/base/fields.py +++ b/mongoengine/base/fields.py @@ -425,8 +425,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 fbc8ce4a..e7eb4901 100644 --- a/tests/queryset/queryset.py +++ b/tests/queryset/queryset.py @@ -4693,6 +4693,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()