diff options
author | Raphaël Barrois <raphael.barrois@polytechnique.org> | 2015-10-20 23:18:22 +0200 |
---|---|---|
committer | Raphaël Barrois <raphael.barrois@polytechnique.org> | 2015-10-20 23:18:22 +0200 |
commit | f30c7b243a112eb07af0bcddbd9a211596ed80d7 (patch) | |
tree | b935c1025fe73d6d033fd2e52afda1ebfdcb8125 | |
parent | 15f328350311ee46f84c628310e58e4ed8b49e13 (diff) | |
download | factory-boy-f30c7b243a112eb07af0bcddbd9a211596ed80d7.tar factory-boy-f30c7b243a112eb07af0bcddbd9a211596ed80d7.tar.gz |
Lazy load django's get_model (Closes #228).
Loading this function will, on pre-1.8 versions, load Django settings.
We'll lazy-load it to avoid crashes when Django hasn't been configured
yet (e.g in auto-discovery test setups).
-rw-r--r-- | docs/changelog.rst | 1 | ||||
-rw-r--r-- | factory/django.py | 34 |
2 files changed, 27 insertions, 8 deletions
diff --git a/docs/changelog.rst b/docs/changelog.rst index 01d5775..24c01aa 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -21,6 +21,7 @@ ChangeLog - :issue:`201`: Properly handle custom Django managers when dealing with abstract Django models. - :issue:`212`: Fix :meth:`factory.django.mute_signals` to handle Django's signal caching + - :issue:`228`: Don't load :func:`django.apps.apps.get_model()` until required .. _v2.5.2: diff --git a/factory/django.py b/factory/django.py index b2af12c..b3c508c 100644 --- a/factory/django.py +++ b/factory/django.py @@ -56,16 +56,34 @@ def require_django(): raise import_failure -if django is None: - def get_model(app, model): - raise import_failure +_LAZY_LOADS = {} + +def get_model(app, model): + """Wrapper around django's get_model.""" + if 'get_model' not in _LAZY_LOADS: + _lazy_load_get_model() + + _get_model = _LAZY_LOADS['get_model'] + return _get_model(app, model) + + +def _lazy_load_get_model(): + """Lazy loading of get_model. + + get_model loads django.conf.settings, which may fail if + the settings haven't been configured yet. + """ + if django is None: + def get_model(app, model): + raise import_failure -elif django.VERSION[:2] < (1, 7): - from django.db.models.loading import get_model + elif django.VERSION[:2] < (1, 7): + from django.db.models.loading import get_model -else: - from django import apps as django_apps - get_model = django_apps.apps.get_model + else: + from django import apps as django_apps + get_model = django_apps.apps.get_model + _LAZY_LOADS['get_model'] = get_model class DjangoOptions(base.FactoryOptions): |