Skip to content

Commit 6a18d72

Browse files
committed
Fix dynamic embedded document updates
In order to allow setting new fields on dynamic embedded documents that previously did not exist, the `lookup_member` function returns dynamic fields as appropriate. This enables operations like `A.objects(...).update(foo__newfield="bar")`. Resolves MongoEngine#2486
1 parent 2d1c9af commit 6a18d72

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

mongoengine/fields.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
from mongoengine.base.utils import LazyRegexCompiler
3636
from mongoengine.common import _import_class
3737
from mongoengine.connection import DEFAULT_CONNECTION_NAME, get_db
38-
from mongoengine.document import Document, EmbeddedDocument
38+
from mongoengine.document import Document, EmbeddedDocument, DynamicEmbeddedDocument
3939
from mongoengine.errors import DoesNotExist, InvalidQueryError, ValidationError
4040
from mongoengine.queryset import DO_NOTHING
4141
from mongoengine.queryset.base import BaseQuerySet
@@ -780,6 +780,11 @@ def lookup_member(self, member_name):
780780
field = doc_type._fields.get(member_name)
781781
if field:
782782
return field
783+
if (
784+
member_name not in ("$", "S")
785+
and any(issubclass(doc_type, DynamicEmbeddedDocument) for doc_type in doc_and_subclasses)
786+
):
787+
return DynamicField(db_field=member_name)
783788

784789
def prepare_query_value(self, op, value):
785790
if value is not None and not isinstance(value, self.document_type):

0 commit comments

Comments
 (0)