【问题标题】:Confusing broken imports with Python3 and Django将损坏的导入与 Python3 和 Django 混淆
【发布时间】:2015-08-04 03:12:27
【问题描述】:

我终于从 python2 跳到了 python3(万岁)。但是,我现在被导入错误所困扰,我似乎无法理智地解决这些错误。

我有这样的标准 Django 1.8 布局:

foo_bar
    | - foo_bar
            | - settings.py
            | - urls.py
    | - app_one
    | - app_two
    | - manage.py

当我尝试从另一个应用程序导入某些内容时,我的问题就出现了。例如,将模型从 app_one.models.py 导入到 app_two.views.py

我收到的服务器错误取决于我的操作。

1.绝对导入

# in app_two.views.py
from foo_bar.app_one.models import MyModel

这给出了错误:

No module named foo_bar.app_one

如果我将项目切换回 2.7,则此导入当然可以正常工作。更不用说,PyCharm 能够解析这条路径并自动完成。所以..这很混乱。

2。相对导入:

# in app_two.views.py
from ..app_one.models import MyModel

这给出了错误:

attempted relative import beyond top-level package

再一次,同样的事情,它似乎应该可以工作——甚至 PyCharm 也认为它应该可以工作(并且可以再次从路径自动完成)。但是,每当我运行我的服务器时,它会在加载此视图时爆炸。

解决方式:

现在,我可以让导入工作,但以一种似乎零意义的方式。如果我离开顶层包并放弃相对导入符号,它导入而不会出错。

# in app_two.views.py
from app_one.models import MyModel

但这对我来说比其他任何事情都更没有意义!为什么这行得通???当然,当我换回 2.x 时,这个会中断。此外,PyCharm(就其价值而言)将其显示为无法解析的导入。

【问题讨论】:

  • 使用这种格式:import app_one 用于导入 app_one.models.MyModel 用于使用。
  • 我不了解 django,但是当您遇到错误时,manage.py 是否运行?
  • 尝试从 app_one.models 导入 MyModel

标签: python django python-3.x


【解决方案1】:

对于模型中的外键关系的导入(在 Django 1.8+ 中),您不需要显式导入,但可以使用字符串引用的版本:

# in app1, import Customer from app2
customer_fk = models.ForeignKey('app2.Customer')

完整示例:

from django.db import models

# this app is 'cart'
class ShoppingCart(models.Model):
    # Import Customer Plan from another app - account
    plan = models.ForeignKey('account.CustomerPlan')
    started = models.DateTimeField()
    cart_id = models.BigIntegerField() 

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 2016-06-17
    • 1970-01-01
    • 2019-12-22
    相关资源
    最近更新 更多