使用Python3和Django混淆损坏的导入

时间:2015-08-04 03:12:28

标签: python django python-3.x

我终于从python2跳转到了python3(hooray)。但是,我现在受到导入错误的困扰,我似乎无法理解。

我有这样的标准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(它的价值)表明这是一个无法解决的问题。

1 个答案:

答案 0 :(得分:0)

要导入模型中的外键关系(在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()