【问题标题】:ValueError attempted relative import beyond top-level package, despite PyCharm autofilling suggestions尽管 PyCharm 自动填充建议,ValueError 尝试相对导入超出顶级包
【发布时间】:2019-11-26 21:17:34
【问题描述】:

我正在尝试从同级包中导入模型并得到

ValueError: attempted relative import beyond top-level package

奇怪的是,我是根据 PyCharm 的建议自动填充的,所以 IDE 正在注册模块,但我的构建失败了......

]1

这是我的项目结构:

app
 \
  +-core
  |  \
  |   +- __init__.py
  |   +- models.py   <- the Tag model is present here
  |
  +-scheduler
  |  \
  |   +- __init__.py
  |   +- serializers.py  <- importing app.core.models.Tag in this file
  |
  +- __init__.py

app.scheduler.serializers.py:

from rest_framework import serializers
from ..core.models import Tag


class TagSerializer(serializers.ModelSerializer):
    """Serializer for tag objects"""

    class Meta:
        model = Tag
        fields = ('id', 'name')
        read_only_fields = ('id',)

我一直在摸索这个问题,似乎无法弄清楚......

我尝试过使用绝对路径,甚至使用 PyCharm 导入实用程序添加它:

from rest_framework import serializers
from app.core.models import Tag


class TagSerializer(serializers.ModelSerializer):
    """Serializer for tag objects"""

    class Meta:
        model = Tag
        fields = ('id', 'name')
        read_only_fields = ('id',)

但后来我得到: ModuleNotFoundError: No module named 'app.core'

我正在使用

python manage.py runserver

【问题讨论】:

  • 您是否使用python app/manage.py runserver 来运行您的服务器?还是您从 python shell 中得到这些错误?
  • python manage.py runserver 还有docker-compose up 都给我同样的错误
  • 你试过from core.models import Tag吗?这就是我通常导入 Django 应用程序模型的方式。我也只是在阅读this SO Q/A 关于最初的ValueError 可能会提供更多见解。
  • .....是的,这成功了。我现在很困惑。我所做的所有导入都在 PyCharm 中注册为不正确,这对我来说很有意义,但它们实际上是正确的......我的大脑已经坏了。
  • 回想起来,我已经更新了我的答案。关于 pycharm,我认为如果您转到设置 > Project: project_name > Project Structure,并将“源文件夹”更改为顶级 app 文件夹而不是(我在这里假设)项目文件夹,它应该提供正确的进口。

标签: python django-rest-framework python-import python-packaging django-2.2


【解决方案1】:

真正的答案是顶级app文件夹不包含在python路径中,我参考了this堆栈溢出的答案:

... python 不记录从哪里加载包。所以当你做 python -m test_A.test 时,它基本上只是丢弃了 test_A.test 实际存储在包中的知识......

并推荐使用from core.models import Tag,它似乎工作。

【讨论】:

  • 顶级包中确实有一个__init__.py。我正在编辑问题以包含屏幕截图
猜你喜欢
  • 2016-05-12
  • 2021-10-03
  • 2018-12-05
  • 2020-11-03
  • 2017-02-22
  • 2019-12-24
  • 2018-11-28
相关资源
最近更新 更多