相对导入超出顶级软件包错误

时间:2018-07-27 02:27:40

标签: python django django-rest-framework

I have a project named <code>tweetme</code> which has two apps <code>account</code> and <code>tweets</code> 我有一个名为tweetme的项目,其中有两个应用程序accounttweets,两个应用程序中都有serializers.py文件以序列化数据。因此,当我尝试将序列化程序类从account/api/serializers.py相对导入到另一个应用程序tweets/api/serializers.py时,相对导入会显示错误。

enter image description here

1- 1月1日,我尝试使用完整路径from src.account.api.serializers import UserDisplaySerializer,但在控制台中出现了ModuleNotFoundError: No module named 'src'

错误

enter image description here

2-然后我尝试了from ...account.api.serializers import UserDisplaySerializer,它显示了错误ValueError: attempted relative import beyond top-level package

那我在做什么错呢?如何正确地进行相对导入?

@edit

在src中添加 init .py

    Directory: D:\django\tweetme\src


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       26-07-2018     23:56                account
d-----       25-07-2018     13:56                static-storage
d-----       25-07-2018     19:06                template
d-----       26-07-2018     19:39                tweetme
d-----       26-07-2018     10:54                tweets
-a----       25-07-2018     20:17         143360 db.sqlite3
-a----       13-07-2018     22:40            554 manage.py
-a----       27-07-2018     08:34              0 __init__.py

仍然存在相同的错误...

[![account应用中的用户序列化程序类] [4]] [4]

1 个答案:

答案 0 :(得分:1)

似乎您在__init__.py文件夹中找不到src

From the python docs

  

需要__init__.py文件来使Python将目录视为包含包;这样做是为了防止具有公用名的目录(例如string)无意间隐藏了以后在模块搜索路径上(更深层)出现的有效模块。在最简单的情况下,__init__.py可以只是一个空文件,但它也可以为程序包执行初始化代码或设置__all__变量,如后所述。

删除项目/应用中使用的所有相对导入,并使用绝对导入,因为 推荐使用绝对导入,因为如果导入系统配置不正确,它们通常更易读,并且通常会表现得更好(或至少会提供更好的错误消息)

更新-1

1。/tweetme/src/tweetme/urls.py的更改
注释了两行,因为它们的urls.py没有任何valid patterns

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('tweets.urls')),
    path('api',include('tweets.api.urls')),
    # path('',include('account.urls')),
    # path('api',include('account.api.urls'))
]

if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL,document_root = settings.STATIC_ROOT)

2。/tweetme/src/tweets/api/serializers.py的更改
from src.account.api.serializers import UserDisplaySerializer更改为from account.api.serializers import UserDisplaySerializer

from rest_framework import serializers
from ..models import Tweet
from account.api.serializers import UserDisplaySerializer


class TweetModelSerializer(serializers.ModelSerializer):
    user = UserDisplaySerializer()

    class Meta:
        model = Tweet
        fields = ['user', 'content']