我有一个名为tweetme
的项目,其中有两个应用程序account
和tweets
,两个应用程序中都有serializers.py
文件以序列化数据。因此,当我尝试将序列化程序类从account/api/serializers.py
相对导入到另一个应用程序tweets/api/serializers.py
时,相对导入会显示错误。
1- 1月1日,我尝试使用完整路径from src.account.api.serializers import UserDisplaySerializer
,但在控制台中出现了ModuleNotFoundError: No module named 'src'
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]
答案 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']