diff --git a/mongoengine/base.py b/mongoengine/base.py index 909ed6cd..ea0f98a4 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -381,8 +381,8 @@ class DocumentMetaclass(type): attr_value.db_field = attr_name doc_fields[attr_name] = attr_value attrs['_fields'] = doc_fields - attrs['_db_field_map'] = dict([(k, v.db_field) for k, v in doc_fields.items()]) - attrs['_reverse_db_field_map'] = dict([(v.db_field, k) for k, v in doc_fields.items()]) + attrs['_db_field_map'] = dict([(k, v.db_field) for k, v in doc_fields.items() if k!=v.db_field]) + attrs['_reverse_db_field_map'] = dict([(v, k) for k, v in attrs['_db_field_map'].items()]) new_class = super_new(cls, name, bases, attrs) for field in new_class._fields.values(): @@ -577,6 +577,7 @@ class BaseDocument(object): signals.pre_init.send(self.__class__, document=self, values=values) self._data = {} + self._initialised = False # Assign default values to instance for attr_name, field in self._fields.items(): value = getattr(self, attr_name, None) diff --git a/mongoengine/fields.py b/mongoengine/fields.py index 3234160d..b2f1e2a2 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -911,14 +911,26 @@ class SequenceField(IntField): if instance is None: return self + if not instance._data: return + value = instance._data.get(self.name) + if not value and instance._initialised: value = self.generate_new_value() instance._data[self.name] = value + instance._mark_as_changed(self.name) + return value + def __set__(self, instance, value): + + if value is None and instance._initialised: + value = self.generate_new_value() + + return super(SequenceField, self).__set__(instance, value) + def to_python(self, value): if value is None: value = self.generate_new_value() diff --git a/tests/fields.py b/tests/fields.py index 1f070ae1..f8aeb86c 100644 --- a/tests/fields.py +++ b/tests/fields.py @@ -1425,6 +1425,32 @@ class FieldTest(unittest.TestCase): c = self.db['mongoengine.counters'].find_one({'_id': 'person.id'}) self.assertEqual(c['next'], 10) + def test_sequence_fields_reload(self): + class Animal(Document): + counter = SequenceField() + type = StringField() + + self.db['mongoengine.counters'].drop() + Animal.drop_collection() + + a = Animal(type="Boi") + a.save() + + self.assertEqual(a.counter, 1) + a.reload() + self.assertEqual(a.counter, 1) + + a.counter = None + self.assertEqual(a.counter, 2) + a.save() + + self.assertEqual(a.counter, 2) + + a = Animal.objects.first() + self.assertEqual(a.counter, 2) + a.reload() + self.assertEqual(a.counter, 2) + def test_multiple_sequence_fields_on_docs(self): class Animal(Document):