[IMP] models: optimize _setup_base() by not retrieving proper fields

The method uses the costly `inspect.getmembers` to retrieve the fields defined
on a model's classes.  If the model is not modified by a module installation,
we simply reuse the fields retrieved in a former model setup.
This commit is contained in:
Raphael Collet
2015-08-13 10:44:59 +02:00
parent c6c1824b7a
commit 9fa4c2d1d8
+20 -10
View File
@@ -2932,20 +2932,30 @@ class BaseModel(object):
# 1. determine the proper fields of the model; duplicate them on cls to
# avoid clashes with inheritance between different models
for name in getattr(cls, '_fields', {}):
delattr(cls, name)
proper_fields = getattr(cls, '_proper_fields', None)
if proper_fields is None:
# retrieve fields from parent classes, and add magic fields
cls._fields = {}
cls._defaults = {}
for name, field in getmembers(cls, Field.__instancecheck__):
self._add_field(name, field.new())
self._add_magic_fields()
cls._proper_fields = set(cls._fields)
# retrieve fields from parent classes
cls._fields = {}
cls._defaults = {}
for attr, field in getmembers(cls, Field.__instancecheck__):
self._add_field(attr, field.new())
else:
# redo base setup on proper fields, and remove other fields
for name in set(cls._fields) - proper_fields:
delattr(cls, name)
del cls._fields[name]
cls._defaults.pop(name, None)
for name, field in cls._fields.iteritems():
field.setup_base(self, name)
assert proper_fields == set(cls._fields)
# add magic and custom fields
self._add_magic_fields()
# 2. add custom fields
self._add_manual_fields(partial)
# 2. make sure that parent models determine their own fields, then add
# 3. make sure that parent models determine their own fields, then add
# inherited fields to cls
self._inherits_check()
for parent in self._inherits: