Optimize PolymorphicModel attribute access, only use __getattribute__ hack when needed.
parent
fdf905d91b
commit
d85664f0b7
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue