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,21 +229,20 @@ class PolymorphicModelBase(ModelBase):
# Django's management command 'dumpdata' relies on non-polymorphic
# 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'
# 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).
# This way we don't need to patch django.core.management.commands.dumpdata
# for all supported Django versions.
# TODO: investigate Django how this can be avoided
_dumpdata_command_running = False
if len(sys.argv) > 1:
_dumpdata_command_running = (sys.argv[1] == 'dumpdata')
if len(sys.argv) > 1 and sys.argv[1] == 'dumpdata':
# manage.py dumpdata is running
def __getattribute__(self, name):
if name == '_default_manager':
if self._dumpdata_command_running:
def __getattribute__(self, name):
if name == '_default_manager':
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]:
return self.base_objects
#caller_mod_name = inspect.getmodule(frm[0]).__name__ # does not work with python 2.4
#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