Optimize PolymorphicModel attribute access, only use __getattribute__ hack when needed.

fix_request_path_info
Diederik van der Boor 2015-10-01 13:32:55 +02:00
parent fdf905d91b
commit d85664f0b7
1 changed files with 7 additions and 8 deletions

View File

@ -229,17 +229,15 @@ class PolymorphicModelBase(ModelBase):
# Django's management command 'dumpdata' relies on non-polymorphic # Django's management command 'dumpdata' relies on non-polymorphic
# behaviour of the _default_manager. Therefore, we catch any access to _default_manager # behaviour of the _default_manager. Therefore, we catch any access to _default_manager
# here and return the non-polymorphic default manager instead if we are called from 'dumpdata.py' # here and return the non-polymorphic default manager instead if we are called from 'dumpdata.py'
# Otherwise, the base objects will be upcasted to polymorphic models, and be outputted as such.
# (non-polymorphic default manager is 'base_objects' for polymorphic models). # (non-polymorphic default manager is 'base_objects' for polymorphic models).
# This way we don't need to patch django.core.management.commands.dumpdata # This way we don't need to patch django.core.management.commands.dumpdata
# for all supported Django versions. # for all supported Django versions.
# TODO: investigate Django how this can be avoided if len(sys.argv) > 1 and sys.argv[1] == 'dumpdata':
_dumpdata_command_running = False # manage.py dumpdata is running
if len(sys.argv) > 1:
_dumpdata_command_running = (sys.argv[1] == 'dumpdata')
def __getattribute__(self, name): def __getattribute__(self, name):
if name == '_default_manager': if name == '_default_manager':
if self._dumpdata_command_running:
frm = inspect.stack()[1] # frm[1] is caller file name, frm[3] is caller function name frm = inspect.stack()[1] # frm[1] is caller file name, frm[3] is caller function name
if 'django/core/management/commands/dumpdata.py' in frm[1]: if 'django/core/management/commands/dumpdata.py' in frm[1]:
return self.base_objects return self.base_objects
@ -247,3 +245,4 @@ class PolymorphicModelBase(ModelBase):
#if caller_mod_name == 'django.core.management.commands.dumpdata': #if caller_mod_name == 'django.core.management.commands.dumpdata':
return super(PolymorphicModelBase, self).__getattribute__(name) return super(PolymorphicModelBase, self).__getattribute__(name)
# TODO: investigate Django how this can be avoided