diff --git a/mongoengine/base/document.py b/mongoengine/base/document.py index f64b578b..34409562 100644 --- a/mongoengine/base/document.py +++ b/mongoengine/base/document.py @@ -156,7 +156,7 @@ class BaseDocument: # Handle dynamic data only if an initialised dynamic document if self._dynamic and not self._dynamic_lock: - if not hasattr(self, name) and not name.startswith("_"): + if name not in self._fields_ordered and not name.startswith("_"): DynamicField = _import_class("DynamicField") field = DynamicField(db_field=name, null=True) field.name = name diff --git a/tests/fields/test_sequence_field.py b/tests/fields/test_sequence_field.py index 53e69f7b..c3ecbeec 100644 --- a/tests/fields/test_sequence_field.py +++ b/tests/fields/test_sequence_field.py @@ -274,3 +274,25 @@ class TestSequenceField(MongoDBTestCase): assert foo.counter == bar.counter assert foo._fields["counter"].owner_document == Foo assert bar._fields["counter"].owner_document == Bar + + def test_sequence_setattr_not_incrementing_counter(self): + class Person(DynamicDocument): + id = SequenceField(primary_key=True) + name = StringField() + + self.db["mongoengine.counters"].drop() + Person.drop_collection() + + for x in range(10): + Person(name="Person %s" % x).save() + + c = self.db["mongoengine.counters"].find_one({"_id": "person.id"}) + assert c["next"] == 10 + + # Setting SequenceField field value should not increment counter: + new_person = Person() + new_person.id = 1100 + + # Counter should still be at 10 + c = self.db["mongoengine.counters"].find_one({"_id": "person.id"}) + assert c["next"] == 10