From 0a64f42d5f2162a9f39f49bfd9c5eab9e6f638b1 Mon Sep 17 00:00:00 2001 From: Harry Marr Date: Fri, 18 Dec 2009 16:31:32 +0000 Subject: [PATCH] Renamed Document._id to id (still _id in DB) Although MongoDB uses _id, underscore prefixed attributes imply private access in Python and are sometimes may not be accessed (e.g. in the Django template language), but id should be public. --- mongoengine/base.py | 8 ++++---- mongoengine/document.py | 4 ++-- mongoengine/fields.py | 10 +++++----- tests/document.py | 12 ++++++------ tests/fields.py | 8 ++++---- tests/queryset.py | 4 ++-- 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/mongoengine/base.py b/mongoengine/base.py index abfe05dd..4d42bbcd 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -147,7 +147,7 @@ class TopLevelDocumentMetaclass(DocumentMetaclass): meta.update(attrs.get('meta', {})) attrs['_meta'] = meta - attrs['_id'] = ObjectIdField() + attrs['id'] = ObjectIdField(name='_id') # Set up collection manager, needs the class to have fields so use # DocumentMetaclass before instantiating CollectionManager object @@ -225,7 +225,7 @@ class BaseDocument(object): for field_name, field in self._fields.items(): value = getattr(self, field_name, None) if value is not None: - data[field_name] = field.to_mongo(value) + data[field.name] = field.to_mongo(value) data['_cls'] = self._class_name data['_types'] = self._superclasses.keys() + [self._class_name] return data @@ -248,7 +248,7 @@ class BaseDocument(object): cls = subclasses[class_name] for field_name, field in cls._fields.items(): - if field_name in data: - data[field_name] = field.to_python(data[field_name]) + if field.name in data: + data[field_name] = field.to_python(data[field.name]) return cls(**data) diff --git a/mongoengine/document.py b/mongoengine/document.py index 359a1789..a0bbda7c 100644 --- a/mongoengine/document.py +++ b/mongoengine/document.py @@ -18,8 +18,8 @@ class Document(BaseDocument): """Save the document to the database. If the document already exists, it will be updated, otherwise it will be created. """ - _id = self.objects._collection.save(self.to_mongo()) - self._id = _id + object_id = self.objects._collection.save(self.to_mongo()) + self.id = object_id @classmethod def drop_collection(cls): diff --git a/mongoengine/fields.py b/mongoengine/fields.py index c8a9086d..1625a582 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -179,19 +179,19 @@ class ReferenceField(BaseField): def to_mongo(self, document): if isinstance(document, (str, unicode, pymongo.objectid.ObjectId)): - _id = document + id_ = document else: try: - _id = document._id + id_ = document.id except: raise ValidationError('You can only reference documents once ' 'they have been saved to the database') - if not isinstance(_id, pymongo.objectid.ObjectId): - _id = pymongo.objectid.ObjectId(_id) + if not isinstance(id_, pymongo.objectid.ObjectId): + id_ = pymongo.objectid.ObjectId(id_) collection = self.document_type._meta['collection'] - return pymongo.dbref.DBRef(collection, _id) + return pymongo.dbref.DBRef(collection, id_) def validate(self, value): assert(isinstance(value, (self.document_type, pymongo.dbref.DBRef))) diff --git a/tests/document.py b/tests/document.py index c20e9b33..0d692395 100644 --- a/tests/document.py +++ b/tests/document.py @@ -41,7 +41,7 @@ class DocumentTest(unittest.TestCase): self.assertEqual(Person._fields['name'], name_field) self.assertEqual(Person._fields['age'], age_field) self.assertFalse('non_field' in Person._fields) - self.assertTrue('_id' in Person._fields) + self.assertTrue('id' in Person._fields) # Test iteration over fields fields = list(Person()) self.assertTrue('name' in fields and 'age' in fields) @@ -145,7 +145,7 @@ class DocumentTest(unittest.TestCase): person['name'] = 'Another User' self.assertEquals(person['name'], 'Another User') - # Length = length(assigned fields + _id) + # Length = length(assigned fields + id) self.assertEquals(len(person), 3) self.assertTrue('age' in person) @@ -160,7 +160,7 @@ class DocumentTest(unittest.TestCase): content = StringField() self.assertTrue('content' in Comment._fields) - self.assertFalse('_id' in Comment._fields) + self.assertFalse('id' in Comment._fields) self.assertFalse(hasattr(Comment, '_meta')) def test_save(self): @@ -174,14 +174,14 @@ class DocumentTest(unittest.TestCase): person_obj = collection.find_one({'name': 'Test User'}) self.assertEqual(person_obj['name'], 'Test User') self.assertEqual(person_obj['age'], 30) - self.assertEqual(person_obj['_id'], person._id) + self.assertEqual(person_obj['_id'], person.id) def test_save_custom_id(self): """Ensure that a document may be saved with a custom _id. """ # Create person object and save it to the database person = self.Person(name='Test User', age=30, - _id='497ce96f395f2f052a494fd4') + id='497ce96f395f2f052a494fd4') person.save() # Ensure that the object is in the database with the correct _id collection = self.db[self.Person._meta['collection']] @@ -268,7 +268,7 @@ class DocumentTest(unittest.TestCase): post_obj.author.age = 25 post_obj.author.save() - author = self.Person.objects(name='Test User').first() + author = list(self.Person.objects(name='Test User'))[-1] self.assertEqual(author.age, 25) BlogPost.drop_collection() diff --git a/tests/fields.py b/tests/fields.py index e8e7a46b..49c3f70f 100644 --- a/tests/fields.py +++ b/tests/fields.py @@ -46,10 +46,10 @@ class FieldTest(unittest.TestCase): name = StringField() person = Person(name='Test User') - self.assertRaises(AttributeError, getattr, person, '_id') - self.assertRaises(ValidationError, person.__setattr__, '_id', 47) - self.assertRaises(ValidationError, person.__setattr__, '_id', 'abc') - person._id = '497ce96f395f2f052a494fd4' + self.assertRaises(AttributeError, getattr, person, 'id') + self.assertRaises(ValidationError, person.__setattr__, 'id', 47) + self.assertRaises(ValidationError, person.__setattr__, 'id', 'abc') + person.id = '497ce96f395f2f052a494fd4' def test_string_validation(self): """Ensure that invalid values cannot be assigned to string fields. diff --git a/tests/queryset.py b/tests/queryset.py index 344ee65d..0ba1bb16 100644 --- a/tests/queryset.py +++ b/tests/queryset.py @@ -53,7 +53,7 @@ class QuerySetTest(unittest.TestCase): self.assertEqual(people.count(), 2) results = list(people) self.assertTrue(isinstance(results[0], self.Person)) - self.assertTrue(isinstance(results[0]._id, (pymongo.objectid.ObjectId, + self.assertTrue(isinstance(results[0].id, (pymongo.objectid.ObjectId, str, unicode))) self.assertEqual(results[0].name, "User A") self.assertEqual(results[0].age, 20) @@ -99,7 +99,7 @@ class QuerySetTest(unittest.TestCase): self.assertEqual(person.name, "User A") # Find a document using just the object id - person = self.Person.objects.with_id(person1._id) + person = self.Person.objects.with_id(person1.id) self.assertEqual(person.name, "User A") def test_find_embedded(self):