|
@@ -19,7 +19,7 @@ from django.db.models.query_utils import DeferredAttribute, deferred_class_facto
|
|
|
from django.db.models.deletion import Collector
|
|
|
from django.db.models.options import Options
|
|
|
from django.db.models import signals
|
|
|
-from django.db.models.loading import register_models, get_model
|
|
|
+from django.db.models.loading import register_models, get_model, MODELS_MODULE_NAME
|
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
from django.utils.functional import curry
|
|
|
from django.utils.encoding import force_str, force_text
|
|
@@ -86,10 +86,22 @@ class ModelBase(type):
|
|
|
base_meta = getattr(new_class, '_meta', None)
|
|
|
|
|
|
if getattr(meta, 'app_label', None) is None:
|
|
|
- # Figure out the app_label by looking one level up.
|
|
|
+ # Figure out the app_label by looking one level up from the package
|
|
|
+ # or module named 'models'. If no such package or module exists,
|
|
|
+ # fall back to looking one level up from the module this model is
|
|
|
+ # defined in.
|
|
|
+
|
|
|
# For 'django.contrib.sites.models', this would be 'sites'.
|
|
|
+ # For 'geo.models.places' this would be 'geo'.
|
|
|
+
|
|
|
model_module = sys.modules[new_class.__module__]
|
|
|
- kwargs = {"app_label": model_module.__name__.split('.')[-2]}
|
|
|
+ package_components = model_module.__name__.split('.')
|
|
|
+ package_components.reverse() # find the last occurrence of 'models'
|
|
|
+ try:
|
|
|
+ app_label_index = package_components.index(MODELS_MODULE_NAME) + 1
|
|
|
+ except ValueError:
|
|
|
+ app_label_index = 1
|
|
|
+ kwargs = {"app_label": package_components[app_label_index]}
|
|
|
else:
|
|
|
kwargs = {}
|
|
|
|