gpt4 book ai didi

python - 奇怪的 django 导入行为

转载 作者:太空狗 更新时间:2023-10-30 03:07:04 25 4
gpt4 key购买 nike

有人可以解释一下这种行为吗:

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'>

知道我在这里做错了什么吗?我的解决方法(除了确保我导入“正确的方式”之外)是使错误类成为模型本身的成员(如 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 时,您会以两种方式从路径加载同一模块:

  • 当前目录
  • 当前目录的上一层目录

这样您就可以导入完全合格的包(包括项目名称)并让一切正常运行。

我倾向于从不使用项目名称导入以避免这个问题。

关于python - 奇怪的 django 导入行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6371129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com