@@ -64,8 +64,6 @@ def __init__(self, *args, **values):
6464 It may contain additional reserved keywords, e.g. "__auto_convert".
6565 :param __auto_convert: If True, supplied values will be converted
6666 to Python-type values via each field's `to_python` method.
67- :param __only_fields: A set of fields that have been loaded for
68- this document. Empty if all fields have been loaded.
6967 :param _created: Indicates whether this is a brand new document
7068 or whether it's already been persisted before. Defaults to true.
7169 """
@@ -80,8 +78,6 @@ def __init__(self, *args, **values):
8078
8179 __auto_convert = values .pop ("__auto_convert" , True )
8280
83- __only_fields = set (values .pop ("__only_fields" , values ))
84-
8581 _created = values .pop ("_created" , True )
8682
8783 signals .pre_init .send (self .__class__ , document = self , values = values )
@@ -106,36 +102,31 @@ def __init__(self, *args, **values):
106102 self ._dynamic_fields = SON ()
107103
108104 # Assign default values to the instance.
109- # We set default values only for fields loaded from DB. See
110- # https://github.com/mongoengine/mongoengine/issues/399 for more info.
111105 for key , field in self ._fields .items ():
112- if self ._db_field_map .get (key , key ) in __only_fields :
106+ if self ._db_field_map .get (key , key ) in values :
113107 continue
114108 value = getattr (self , key , None )
115109 setattr (self , key , value )
116110
117111 if "_cls" not in values :
118112 self ._cls = self ._class_name
119113
120- # Set passed values after initialisation
121- if self ._dynamic :
122- dynamic_data = {}
123- for key , value in values .items ():
124- if key in self ._fields or key == "_id" :
125- setattr (self , key , value )
126- else :
114+ # Set actual values
115+ dynamic_data = {}
116+ FileField = _import_class ("FileField" )
117+ for key , value in values .items ():
118+ key = self ._reverse_db_field_map .get (key , key )
119+ field = self ._fields .get (key )
120+ if field or key in ("id" , "pk" , "_cls" ):
121+ if __auto_convert and value is not None :
122+ if field and not isinstance (field , FileField ):
123+ value = field .to_python (value )
124+ setattr (self , key , value )
125+ else :
126+ if self ._dynamic :
127127 dynamic_data [key ] = value
128- else :
129- FileField = _import_class ("FileField" )
130- for key , value in values .items ():
131- key = self ._reverse_db_field_map .get (key , key )
132- if key in self ._fields or key in ("id" , "pk" , "_cls" ):
133- if __auto_convert and value is not None :
134- field = self ._fields .get (key )
135- if field and not isinstance (field , FileField ):
136- value = field .to_python (value )
137- setattr (self , key , value )
138128 else :
129+ # For strict Document
139130 self ._data [key ] = value
140131
141132 # Set any get_<field>_display methods
@@ -758,11 +749,8 @@ def _get_collection_name(cls):
758749 return cls ._meta .get ("collection" , None )
759750
760751 @classmethod
761- def _from_son (cls , son , _auto_dereference = True , only_fields = None , created = False ):
752+ def _from_son (cls , son , _auto_dereference = True , created = False ):
762753 """Create an instance of a Document (subclass) from a PyMongo SON."""
763- if not only_fields :
764- only_fields = []
765-
766754 if son and not isinstance (son , dict ):
767755 raise ValueError (
768756 "The source SON object needs to be of type 'dict' but a '%s' was found"
@@ -817,9 +805,7 @@ def _from_son(cls, son, _auto_dereference=True, only_fields=None, created=False)
817805 if cls .STRICT :
818806 data = {k : v for k , v in data .items () if k in cls ._fields }
819807
820- obj = cls (
821- __auto_convert = False , _created = created , __only_fields = only_fields , ** data
822- )
808+ obj = cls (__auto_convert = False , _created = created , ** data )
823809 obj ._changed_fields = []
824810 if not _auto_dereference :
825811 obj ._fields = fields
0 commit comments