diff --git a/mongoengine/base/document.py b/mongoengine/base/document.py index 5707992a..7142a3de 100644 --- a/mongoengine/base/document.py +++ b/mongoengine/base/document.py @@ -184,7 +184,7 @@ class BaseDocument(object): self__initialised = False # Check if the user has created a new instance of a class if (self._is_document and self__initialised - and self__created and name == self._meta['id_field']): + and self__created and name == self._meta.get('id_field')): super(BaseDocument, self).__setattr__('_created', False) super(BaseDocument, self).__setattr__(name, value) diff --git a/mongoengine/document.py b/mongoengine/document.py index eedd01d2..01b69fb2 100644 --- a/mongoengine/document.py +++ b/mongoengine/document.py @@ -152,6 +152,8 @@ class Document(BaseDocument): """ def fget(self): + if not 'id_field' in self._meta: + return None return getattr(self, self._meta['id_field']) def fset(self, value): diff --git a/tests/document/inheritance.py b/tests/document/inheritance.py index e8347054..afa3ccea 100644 --- a/tests/document/inheritance.py +++ b/tests/document/inheritance.py @@ -307,6 +307,17 @@ class InheritanceTest(unittest.TestCase): doc = Animal(name='dog') self.assertFalse('_cls' in doc.to_mongo()) + def test_abstract_document_creation_does_not_fail(self): + + class City(Document): + continent = StringField() + meta = {'abstract': True, + 'allow_inheritance': False} + bkk = City(continent='asia') + self.assertEqual(None, bkk.pk) + # TODO: expected error? Shouldn'twe created a new error type + self.assertRaises(KeyError, lambda: setattr(bkk, 'pk', 1)) + def test_allow_inheritance_embedded_document(self): """Ensure embedded documents respect inheritance """