diff --git a/mongoengine/queryset/base.py b/mongoengine/queryset/base.py index 862a1826..5f11c01e 100644 --- a/mongoengine/queryset/base.py +++ b/mongoengine/queryset/base.py @@ -1845,10 +1845,7 @@ class BaseQuerySet(object): # remove it from the doc (we always fetch it so that we can properly # construct documents). fields = self._loaded_fields - if fields and '_id' in doc and ( - (fields.value == QueryFieldList.ONLY and '_id' not in fields.fields) or - (fields.value == QueryFieldList.EXCLUDE and '_id' in fields.fields) - ): + if fields and '_id' in doc and fields.value == QueryFieldList.EXCLUDE and '_id' in fields.fields: del doc['_id'] return doc diff --git a/tests/queryset/queryset.py b/tests/queryset/queryset.py index b44c36df..586913aa 100644 --- a/tests/queryset/queryset.py +++ b/tests/queryset/queryset.py @@ -4635,7 +4635,7 @@ class QuerySetTest(unittest.TestCase): ip = StringField() class User(Document): - id = ObjectIdField('_id') + id = StringField(primary_key=True) name = StringField() age = IntField() price = DecimalField() @@ -4643,9 +4643,10 @@ class QuerySetTest(unittest.TestCase): User.drop_collection() - User.objects.create(name="Bob Dole", age=89, price=Decimal('1.11')) + User.objects.create(id='Bob', name="Bob Dole", age=89, price=Decimal('1.11')) User.objects.create( - name="Barack Obama", + id='Barak', + name="Barak Obama", age=51, price=Decimal('2.22'), last_login=LastLogin( @@ -4673,7 +4674,7 @@ class QuerySetTest(unittest.TestCase): self.assertIsInstance(results[1], dict) self.assertEqual(results[0]['name'], 'Bob Dole') self.assertEqual(results[0]['price'], 1.11) - self.assertEqual(results[1]['name'], 'Barack Obama') + self.assertEqual(results[1]['name'], 'Barak Obama') self.assertEqual(results[1]['price'], 2.22) users = User.objects.only('name', 'last_login').as_pymongo() @@ -4681,10 +4682,12 @@ class QuerySetTest(unittest.TestCase): self.assertIsInstance(results[0], dict) self.assertIsInstance(results[1], dict) self.assertEqual(results[0], { + '_id': 'Bob', 'name': 'Bob Dole' }) self.assertEqual(results[1], { - 'name': 'Barack Obama', + '_id': 'Barak', + 'name': 'Barak Obama', 'last_login': { 'location': 'White House', 'ip': '104.107.108.116' @@ -4701,8 +4704,8 @@ class QuerySetTest(unittest.TestCase): db_field='password_salt', required=True) User.drop_collection() - User(email="ross@example.com", password_salt="SomeSalt", - password_hash="SomeHash").save() + user = User(email="ross@example.com", password_salt="SomeSalt", + password_hash="SomeHash").save() serialized_user = User.objects.exclude( 'password_salt', 'password_hash').as_pymongo()[0] @@ -4714,11 +4717,16 @@ class QuerySetTest(unittest.TestCase): serialized_user = User.objects.exclude( 'password_salt').only('email').as_pymongo()[0] + self.assertEqual(set(['_id', 'email']), set(serialized_user.keys())) + + serialized_user = User.objects.exclude( + 'password_salt', 'id').only('email').as_pymongo()[0] self.assertEqual(set(['email']), set(serialized_user.keys())) serialized_user = User.objects.exclude( 'password_salt').only('email').to_json() - self.assertEqual('[{"email": "ross@example.com"}]', serialized_user) + self.assertEqual('[{"_id": {"$oid": "%s"}, "email": "ross@example.com"}]' % user.id, + serialized_user) def test_only_after_count(self): """Test that only() works after count()"""