与外部数据库表"Conflicting models in application..."



我有一个项目,其中包含许多应用程序,这些应用程序既可以访问我的本地MySQL数据库(包含100个表),也可以访问几个外部MySQL和Ms SQL Server数据库(包含更多表)。所有外部表都是使用"managed=False"元数据在模型中定义的。

我最近按照StackOveflow的发行说明和其他提示等,将Django从1.6升级到1.7。

除了我的所有访问远程数据库表的应用程序之外,一切似乎都恢复了正常。下面是一个示例消息:

RuntimeError: Conflicting 'bugview_deferred_description_disposition_divisioaf59cb28117de5eb6ddfea0476dab601' models in application 'nvbugsdw': <class 'bug_metrics.models_bugs.BugView_Deferred_Description_Disposition_Divisioaf59cb28117de5eb6ddfea0476dab601'> and <class 'bug_metrics.models_bugs.BugView_Deferred_Description_Disposition_Divisioaf59cb28117de5eb6ddfea0476dab601'>.

BugView表在文件名models_bugs.py中定义如下:

class BugView(models.Model):
BugId            = models.BigIntegerField(primary_key=True)
Module           = models.CharField(max_length=128, null=False)
Requester        = models.CharField(max_length=128, null=False)
QAEngineer       = models.CharField(max_length=128, null=False)
Engineer         = models.CharField(max_length=128, null=False)
RequestDate      = models.DateTimeField(null=False)
ModifiedDate     = models.DateTimeField(null=False)
Priority         = models.CharField(max_length=50, null=False)
Severity         = models.CharField(max_length=50, null=False)
Disposition      = models.CharField(max_length=64, null=False)
BugAction        = models.CharField(max_length=64, null=False)
Origin           = models.CharField(max_length=64, null=False)
GeographicOrigin = models.CharField(max_length=128, null=False)
Division         = models.CharField(max_length=64, null=False)
Synopsis         = models.CharField(max_length=256, null=False)
Description      = models.CharField(max_length=1024, null=False)
BugType          = models.CharField(max_length=50, null=False)
OriginalBugId    = models.BigIntegerField()
class Meta:
    app_label = 'nvbugsdw'
    managed   = False
    db_table  = 'bugview'

在views.py文件中,类被导入为:

from .models_bugs import BugView

我也试过

from models_bugs import BugView
from bug_metrics.models_bugs import BugView

"bug_metrics"是应用程序名称。

我遵循了之前在上发布的所有建议https://code.djangoproject.com/ticket/22280没有效果。

在这一点上我不知所措。有什么建议吗?

此外,这可能与此无关,但在尝试调试此问题时(通过在manage.py中转储sys.path),我注意到当我运行命令时,manage.py的代码被执行了两次

./manage.py runserver --nothreading 0.0.0.0:8081

我的系统路径是:

/opt/graphic_tools/gtools
/usr/local/lib/python2.7/dist-packages/South-0.8.4-py2.7.egg
/usr/lib/python2.7
/usr/lib/python2.7/plat-linux2
/usr/lib/python2.7/lib-tk
/usr/lib/python2.7/lib-old
/usr/lib/python2.7/lib-dynload
/usr/local/lib/python2.7/dist-packages
/usr/lib/python2.7/dist-packages
/usr/lib/python2.7/dist-packages/PIL
/usr/lib/python2.7/dist-packages/gst-0.10
/usr/lib/python2.7/dist-packages/gtk-2.0
/usr/lib/pymodules/python2.7
/usr/lib/python2.7/dist-packages/ubuntu-sso-client
/usr/lib/python2.7/dist-packages/ubuntuone-client
/usr/lib/python2.7/dist-packages/ubuntuone-control-panel
/usr/lib/python2.7/dist-packages/ubuntuone-couch
/usr/lib/python2.7/dist-packages/ubuntuone-installer
/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol

"/opt/graphic_tools/gtools"是我的项目目录。它不包含init.py文件,并且包含所有应用程序子目录,包括"gtools"子目录。

一个建议。在升级到Django的新版本后,您是否尝试同步您的"远程"数据库?也许它们没有同步?

我想你有这样的东西:数据库={

"默认":{一些凭据},

"remote_db_name1":{一些凭据},

"remote_db_name2":{一些凭据},…

}

你可以运行

/manage.py migrate--database=remote_db_name1

/manage.py migrate--database=remote_db_name2

等等。(此外,我假设您以前为应用程序运行过"makemigrations"。)

原因是默认情况下migrate在"default"数据库上运行,因此其他数据库可能会被跳过。

所以,在我的特殊情况下,问题是由运行旧版本的Django引起的。我以为我安装了1.7.11,但实际上安装了1.7.0。当我安装1.7.11时,问题就消失了。

错误的方式:

sudo pip install django=="1.7"

正确方式:

sudo pip install django=="1.7.11"

最新更新