Как решить RuntimeError - модели, конфликтующие в Django? - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь подключить внешнюю базу данных mysql к Django только для чтения данных. Я следовал инструкции в соответствии с Django Doc для подключения нескольких БД. Однако, когда я пытаюсь makemigration / migrate новой БД, она возвращает ошибку, как показано ниже. Я провел некоторое исследование на Google и обнаружил, что не так много решений и может решить мою проблему. Это мой первый раз, чтобы увидеть это и не знаю, в чем причина ошибки. Я импортирую модели по inspectdb, и TotalopennumTmp является одной из моделей в БД. Спасибо за помощь в решении этой проблемы.

ERROR:
Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/home/app/venv/lib/python3.6/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
    utility.execute()
  File "/home/app/venv/lib/python3.6/site-packages/django/core/management/__init__.py", line 347, in execute
    django.setup()
  File "/home/app/venv/lib/python3.6/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/app/venv/lib/python3.6/site-packages/django/apps/registry.py", line 112, in populate
    app_config.import_models()
  File "/home/app/venv/lib/python3.6/site-packages/django/apps/config.py", line 198, in import_models
    self.models_module = import_module(models_module_name)
  File "/home/app/venv/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/app/app/models.py", line 1007, in <module>
    class TotalopennumTmp(models.Model):
  File "/home/app/venv/lib/python3.6/site-packages/django/db/models/base.py", line 309, in __new__
    new_class._meta.apps.register_model(new_class._meta.app_label, new_class)
  File "/home/app/venv/lib/python3.6/site-packages/django/apps/registry.py", line 221, in register_model
    (model_name, app_label, app_models[model_name], model))
RuntimeError: Conflicting 'totalopennumtmp' models in application 'app': <class 'app.app.models.TotalOpennumTmp'> and <class 'app.app.models.TotalopennumTmp'>.

settings.py:

DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.mysql',
              'NAME': 'local',
              #skip the detail
          },
          'afe':{
              'ENGINE': 'django.db.backends.mysql',
              'NAME': 'myapp_db',
              'USER': 'root',
              'PASSWORD': 'pwd',
              'HOST': 'mysql_host',
              'PORT': 'mysql_port',
          }
  }

  DATABASE_ROUTERS = ['myapp.routers.MyAppRouter',]

routers.py

class MyAppRouter:
      def db_for_read(self, model, **hints):
          if model._meta.app_label == 'myapp':
              return 'myapp_db'
          return None

      def allow_relation(self, obj1, obj2, **hints):
          if obj1._meta.app_label == 'myapp' or \
             obj2._meta.app_label == 'myapp':
              return True
          return None

      def allow_migrate(self, db, app_label, model_name=None,  **hints):
          if app_label == 'myapp':
              return db == 'myapp_db'
          return None

      def allow_syncdb(self, db, model):
          #make sure myapp only appear on myapp_db db
          if db == 'myapp_db':
              return model._meta.app_label == 'myapp'
          elif model._meta.app_label == 'myapp':
              return False
          return None

models.py

class TotalOpennumTmp(models.Model):
    #some field
    class Meta:
        managed = False
        db_table = 'total_opennum_tmp'

class TotalopennumTmp(models.Model):
    #some field
    class Meta:
        managed = False
        db_table = 'totalopennum_tmp'
...