Performance improvement: build a _writable_fields list once instead of calculating it every time it's needed

This commit is contained in:
Itai Shirav 2017-04-05 18:20:01 +03:00
parent c5a9b16eac
commit dacf88adbf

View File

@ -27,6 +27,7 @@ class ModelBase(type):
fields = base_fields + [item for item in attrs.items() if isinstance(item[1], Field)]
fields.sort(key=lambda item: item[1].creation_counter)
setattr(new_cls, '_fields', fields)
setattr(new_cls, '_writable_fields', [f for f in fields if not f[1].readonly])
return new_cls
@classmethod
@ -186,7 +187,7 @@ class Model(with_metaclass(ModelBase)):
:param bool include_readonly: If False, returns only fields, that can be inserted into database
'''
data = self.__dict__
fields = self._fields if include_readonly else [f for f in self._fields if not f[1].readonly]
fields = self._fields if include_readonly else self._writable_fields
return '\t'.join(field.to_db_string(data[name], quote=False) for name, field in fields)
def to_dict(self, include_readonly=True, field_names=None):
@ -195,7 +196,7 @@ class Model(with_metaclass(ModelBase)):
:param bool include_readonly: If False, returns only fields, that can be inserted into database
:param field_names: An iterable of field names to return
'''
fields = self._fields if include_readonly else [f for f in self._fields if not f[1].readonly]
fields = self._fields if include_readonly else self._writable_fields
if field_names is not None:
fields = [f for f in fields if f[0] in field_names]