Python 奇怪的django进口行为

Python 奇怪的django进口行为,python,django,Python,Django,请有人解释一下这种行为: django项目名为foo 文件bar/models.py: class MyModelError(TypeError): pass class MyModel(models.Model): ... /manage.py shell >>> from foo.bar.models import MyModel as m1 >>> from bar.models import MyModel as m2 >&g

请有人解释一下这种行为:

django项目名为
foo

文件
bar/models.py

class MyModelError(TypeError):
    pass

class MyModel(models.Model):
    ...
/manage.py shell

>>> from foo.bar.models import MyModel as m1
>>> from bar.models import MyModel as m2
>>> from foo.bar.models import MyModelError as e1
>>> from bar.models import MyModelError as e2
>>> m1 is m2
True
>>> e1 is e2
False
假的

>>> m1
<class 'foo.bar.models.MyModel'>
>>> m2
<class 'foo.bar.models.MyModel'>
>>> e1
<class 'foo.bar.models.MyModelError'>
>>> e1
<class 'bar.models.MyModelError'>
m1 >>>平方米 >>>e1 >>>e1
知道我做错了什么吗?我的解决方法(除了确保以“正确的方式”导入之外)是使错误类成为模型本身的一个成员(如django
model.DoesNotExists
),但我想知道发生了什么事,django使用元类定义模型。这里有一个复选框,以避免两次定义模型,因此当创建一个类时,如果已经定义了该类,那么您将获得之前定义的版本。请参见
django.db.models.base.ModelBase

from django.db.models.loading import get_model

# Bail out early if we have already created this class.
m = get_model(new_class._meta.app_label, name, False)
if m is not None:
    return m
尽管错误类是常规Python类,并且没有这样的缓存,但是您会得到不同的版本,因为它们所属的模块不同。我认为会出现这种情况,因为在运行Django runserver时,您会以两种方式结束从路径加载同一模块:

  • 当前目录
  • 当前目录上方的目录
这样您就可以导入完全限定的包(包括项目名称)并使其正常工作


为了避免这个问题,我倾向于从不使用项目名称进行导入。

在大多数编程语言中,错误悬挂有一种阶梯式的机制。所以,如果发生错误,异常机制将开始搜索异常以处理错误。若异常不能在该类中处理,它将保持对该类派生的类的上层搜索。。。。它使这个过程在继承的最高层次上进行

因此,您正在定义一个派生自TypeErrorModelError类,并且从不同路径导入该类可能会导致python Interpeter将这两个类识别为不同的类


不要将点作为模块名称的一部分。我敢肯定这是一个输入错误,因为您不能通过
import
导入名称中带有点的模块。