summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaphaël Barrois <raphael.barrois@polytechnique.org>2015-10-20 23:18:22 +0200
committerRaphaël Barrois <raphael.barrois@polytechnique.org>2015-10-20 23:18:22 +0200
commitf30c7b243a112eb07af0bcddbd9a211596ed80d7 (patch)
treeb935c1025fe73d6d033fd2e52afda1ebfdcb8125
parent15f328350311ee46f84c628310e58e4ed8b49e13 (diff)
downloadfactory-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.rst1
-rw-r--r--factory/django.py34
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):