【问题标题】:Upgrade to Django 1.9 or 1.11 (from 1.6) - Error when calling the metaclass bases升级到 Django 1.9 或 1.11(从 1.6 开始) - 调用元类基时出错
【发布时间】:2017-04-26 13:00:53
【问题描述】:

我正在升级到 django 1.9(从 1.6)

mysql-connector-python 2.1.6 已安装

当我尝试运行我的应用程序时,我得到:

TypeError: Error when calling the metaclass bases
    'NoneType' object is not callable

有人遇到过这个问题吗?

堆栈跟踪:

/Library/Python/2.7/site-packages/django/core/handlers/wsgi.pyc in __init__(self, *args, **kwargs)
    149     def __init__(self, *args, **kwargs):
    150         super(WSGIHandler, self).__init__(*args, **kwargs)
--> 151         self.load_middleware()
    152 
    153     def __call__(self, environ, start_response):

/Library/Python/2.7/site-packages/django/core/handlers/base.pyc in load_middleware(self)
     55             for middleware_path in settings.MIDDLEWARE_CLASSES:
     56                 print middleware_path
---> 57                 mw_class = import_string(middleware_path)
     58                 try:
     59                     mw_instance = mw_class()

/Library/Python/2.7/site-packages/django/utils/module_loading.pyc in import_string(dotted_path)
     18         six.reraise(ImportError, ImportError(msg), sys.exc_info()[2])
     19 
---> 20     module = import_module(module_path)
     21 
     22     try:

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.pyc in import_module(name, package)
     35             level += 1
     36         name = _resolve_name(name[level:], package, level)
---> 37     __import__(name)
     38     return sys.modules[name]

/Library/Python/2.7/site-packages/django/contrib/auth/middleware.py in <module>()
      2 from django.contrib import auth
      3 from django.contrib.auth import load_backend
----> 4 from django.contrib.auth.backends import RemoteUserBackend
      5 from django.core.exceptions import ImproperlyConfigured
      6 from django.utils.deprecation import MiddlewareMixin

/Library/Python/2.7/site-packages/django/contrib/auth/backends.py in <module>()
      2 
      3 from django.contrib.auth import get_user_model
----> 4 from django.contrib.auth.models import Permission
      5 
      6 UserModel = get_user_model()

/Library/Python/2.7/site-packages/django/contrib/auth/models.py in <module>()
      2 
      3 from django.contrib import auth
----> 4 from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
      5 from django.contrib.auth.signals import user_logged_in
      6 from django.contrib.contenttypes.models import ContentType

/Library/Python/2.7/site-packages/django/contrib/auth/base_user.py in <module>()
     50 
     51 @python_2_unicode_compatible
---> 52 class AbstractBaseUser(models.Model):
     53     password = models.CharField(_('password'), max_length=128)
     54     last_login = models.DateTimeField(_('last login'), blank=True, null=True)

/Library/Python/2.7/site-packages/django/db/models/base.pyc in __new__(cls, name, bases, attrs)
    122                 app_label = app_config.label
    123 
--> 124         new_class.add_to_class('_meta', Options(meta, app_label))
    125         if not abstract:
    126             new_class.add_to_class(

/Library/Python/2.7/site-packages/django/db/models/base.pyc in add_to_class(cls, name, value)
    328         # We should call the contribute_to_class method only if it's bound
    329         if not inspect.isclass(value) and hasattr(value, 'contribute_to_class'):
--> 330             value.contribute_to_class(cls, name)
    331         else:
    332             setattr(cls, name, value)

/Library/Python/2.7/site-packages/django/db/models/options.pyc in contribute_to_class(self, cls, name)
    212         if not self.db_table:
    213             self.db_table = "%s_%s" % (self.app_label, self.model_name)
--> 214             self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
    215 
    216     def _prepare(self, model):

/Library/Python/2.7/site-packages/django/db/__init__.pyc in __getattr__(self, item)
     31     """
     32     def __getattr__(self, item):
---> 33         return getattr(connections[DEFAULT_DB_ALIAS], item)
     34 
     35     def __setattr__(self, name, value):

/Library/Python/2.7/site-packages/django/db/utils.pyc in __getitem__(self, alias)
    210         db = self.databases[alias]
    211         backend = load_backend(db['ENGINE'])
--> 212         conn = backend.DatabaseWrapper(db, alias)
    213         setattr(self._connections, alias, conn)
    214         return conn

/Library/Python/2.7/site-packages/mysql/connector/django/base.pyc in __init__(self, *args, **kwargs)
    334 
    335     def __init__(self, *args, **kwargs):
--> 336         super(DatabaseWrapper, self).__init__(*args, **kwargs)
    337 
    338         try:

/Library/Python/2.7/site-packages/django/db/backends/base/base.pyc in __init__(self, settings_dict, alias, allow_thread_sharing)
     94         self.run_commit_hooks_on_set_autocommit_on = False
     95 
---> 96         self.client = self.client_class(self)
     97         self.creation = self.creation_class(self)
     98         self.features = self.features_class(self)

TypeError: Error when calling the metaclass bases
    'NoneType' object is not callable

更新: 我加了

client_class = DatabaseClient 
creation_class = DatabaseCreation
features_class = DatabaseFeatures
introspection_class = DatabaseIntrospection
ops_class = DatabaseOperations
validation_class = DatabaseValidation 

在 DatabaseWrapper 的 mysql/connecotr/django/base.py 中(看起来好像丢失了? - 它在 django1.11/db/backends/mysql/base.py DatabaseWrapper 上)。 但现在我得到了错误:

 Model class django.contrib.contenttypes.models.ContentType doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS

所以我不知道这是否解决了问题或创建了一个新问题

【问题讨论】:

  • 顺便说一句,从 1.6 升级到 1.9 是一个很大的飞跃。如果您先转到 1.8(最好是通过 1.7),您可能会遇到更少的问题。完成此操作后,从 Django 1.8 LTS 升级到 Django 1.11 LTS 应该会更直接。
  • 如果您安装最新版本的mysql-connector-python,或者使用内置的django.db.backends.mysql 后端和mysqlclient,是否也会出现同样的错误?
  • 我尝试安装最新版本的 mysql-connector-python。同样的错误。
  • 我刚刚全新安装了 django 1.11,然后我安装了最新版本的 mysql-connector-python。 pip3 install --egg dev.mysql.com/get/Downloads/Connector-Python/… 运行 python3 /home/django/workspace/mysite/manage.py migrate 后出现同样的错误
  • @pitchblack408 所以你有同样的错误?你解决了吗?

标签: python django python-2.7 upgrade


【解决方案1】:

模型类 django.contrib.contenttypes.models.ContentType 没有明确声明 app_label 并且不在 INSTALLED_APPS 中的应用程序中

此错误通常发生在您的应用在设置文件完全导入之前被导入(即在 INSTALLED_APPS 初始化之前,这发生在设置完成导入之后)。因此,请确保设置文件中没有任何代码,该文件会从其他一些应用程序导入代码。

同时确保您没有在应用程序的 __init__.py 文件中导入模型或类似应用程序代码,以便不会在设置级别自动触发导入。

【讨论】:

  • 您在此处指出的错误是“TypeError:调用元类库时出错”或“未声明显式 app_label 且不在 INSTALLED_APPS 中的应用程序中”
  • 后一种。
  • 在 Django 从 1.8 升级到 1.11 时遇到了同样的错误。 @EyalCh,你是怎么解决的?
  • @Ankush 还没有修复它,我们停止了 django 1.11 升级。如果您设法修复它,请告诉我。
猜你喜欢
  • 1970-01-01
  • 2016-10-10
  • 2017-12-02
  • 2019-09-15
  • 1970-01-01
  • 2014-07-25
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多