我终于从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(它的价值)表明这是一个无法解决的问题。
答案 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()