From fd702fe03422dd7a0d84eeac5c990c5cc46470bd Mon Sep 17 00:00:00 2001
From: Malcolm Tredinnick <malcolm.tredinnick@gmail.com>
Date: Sun, 25 Jun 2006 14:49:34 +0000
Subject: [PATCH] Fixed #1796 -- only load a single copy of each model, even
 when it is referenced via different import paths. Solves a problem with
 many-to-many relations being set up incorrectly. Thanks to Curtis Thompson,
 Luke Plant and Simon Willison for some excellent debugging of the problem.
 Refs #2232 (may also have fixed that).

git-svn-id: http://code.djangoproject.com/svn/django/trunk@3202 bcc190cf-cafb-0310-a4f2-bffc1f526a37
---
 django/db/models/loading.py | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/django/db/models/loading.py b/django/db/models/loading.py
index 96e864cffc..3602090650 100644
--- a/django/db/models/loading.py
+++ b/django/db/models/loading.py
@@ -2,6 +2,8 @@
 
 from django.conf import settings
 from django.core.exceptions import ImproperlyConfigured
+import sys
+import os
 
 __all__ = ('get_apps', 'get_app', 'get_models', 'get_model', 'register_models')
 
@@ -91,4 +93,14 @@ def register_models(app_label, *models):
         # in the _app_models dictionary
         model_name = model._meta.object_name.lower()
         model_dict = _app_models.setdefault(app_label, {})
+        if model_dict.has_key(model_name):
+            # The same model may be imported via different paths (e.g.
+            # appname.models and project.appname.models). We use the source
+            # filename as a means to detect identity.
+            fname1 = os.path.normpath(sys.modules[model.__module__].__file__)
+            fname2 = os.path.normpath(sys.modules[model_dict[model_name].__module__].__file__)
+            # Since the filename extension could be .py the first time and .pyc
+            # or .pyo the second time, ignore the extension when comparing.
+            if os.path.splitext(fname1)[0] == os.path.splitext(fname2)[0]:
+                continue
         model_dict[model_name] = model