@@ -206,25 +206,49 @@ class ModelLoader(Loader):
206
206
def __init__ (self , model , * columns , ** extras ):
207
207
self .model = model
208
208
self ._distinct = None
209
+
210
+ self ._columns = None
211
+ self ._prop_column_map = None
212
+
209
213
if columns :
210
- self .columns = [ _get_column (model , name ) for name in columns ]
214
+ self .columns = tuple ( _get_column (model , name ) for name in columns )
211
215
else :
212
216
self .columns = model
213
217
self .extras = dict ((key , self .get (value )) for key , value in extras .items ())
214
218
self .on_clause = None
215
219
220
+ @property
221
+ def columns (self ):
222
+ return self ._columns
223
+
224
+ @columns .setter
225
+ def columns (self , value ):
226
+ self ._columns = value
227
+ self ._prop_column_map = {
228
+ self .model ._column_name_map .invert_get (c .name ): c for c in self .columns
229
+ }
230
+
216
231
def _do_load (self , row , none_as_none ):
217
232
# none_as_none indicates that in the case of every column of the object is
218
233
# None, whether a None or empty instance of the model should be returned.
219
- values = dict ((c .name , row [c ]) for c in self .columns if c in row )
220
- if none_as_none and all ((v is None ) for v in values .values ()):
234
+ all_is_none = none_as_none
235
+
236
+ values = {}
237
+
238
+ for prop_name , column in self ._prop_column_map .items ():
239
+ if column in row :
240
+ row_value = row [column ]
241
+
242
+ values [prop_name ] = row_value
243
+ all_is_none &= row_value is None
244
+
245
+ if all_is_none :
221
246
return None
247
+
222
248
rv = self .model ()
223
- for c in self .columns :
224
- if c in row :
225
- # noinspection PyProtectedMember
226
- instance_key = self .model ._column_name_map .invert_get (c .name )
227
- rv .__values__ [instance_key ] = row [c ]
249
+ # no need to update, model just created
250
+ rv .__values__ = values
251
+
228
252
return rv
229
253
230
254
def do_load (self , row , context ):
@@ -300,7 +324,7 @@ def load(self, *columns, **extras):
300
324
"""
301
325
302
326
if columns :
303
- self .columns = [ _get_column (self .model , name ) for name in columns ]
327
+ self .columns = tuple ( _get_column (self .model , name ) for name in columns )
304
328
305
329
self .extras .update ((key , self .get (value )) for key , value in extras .items ())
306
330
return self
0 commit comments