PyCharm无法在Django项目应用程序的__init__.py中解析引用

3

我很苦恼这个问题,希望您能帮我解决。

我有一个Django项目,其中包含许多子应用程序,如下所示:

my_project/
    manage.py
    my_project/
        settings.py
        urls.py
        wsgi.py
    app_root/
        __init__.py
        app1/
            __init__.py
            models.py
            views.py
            urls.py
            templates/
                [various templates].html
        app2/
            __init__.py
            models.py
            [etc]
        app3/
            [etc]

在我的Django的settings.py文件中,我安装了如下所示的应用程序:
app_root.app1,
app_root.app2,

在PyCharm中,我尝试了很多方法,但基本上将Content Root设置为顶级的“my_project /”,将app_root、app1、app2等设置为Source Roots。我尝试只将app_root作为唯一的Source Root,也尝试仅将app1app2等设置为Source Roots, 但是没有任何影响。
虽然一切正常运行,应用程序也可以正常运行,但是PyCharm无法解析我的应用程序。
但是,如果我尝试这样做:
import app_root
...
def some_function(self):
    app_root.app1.models.My_Model.objects.all()

这将强调使用错误"在 '__init__.py'中找不到引用 'app1'",这也意味着在进行app_root. app1.时无法在路径的任何位置完成自动完成 - 尽管每个目录都有一个(空)__init__.py 文件,但它对模型、视图等一无所知。

我也不能使用任何重构,因为它总是说“函数不在源根下”

我花费了无数个小时尝试使PyCharm行为正常,但简单地找不到方法。是否有任何方法可以做到这一点,以便PyCharm可以自动完成我的应用程序而不会继续发出检查警告?

2个回答

0

在与PyCharm团队的交流后,我了解到以下内容:

Django使用__import__变量导入INSTALLED_APPS中的所有应用程序及其模型,以便实现自身目的。 在您的情况下,它运行

__import__("app_root.app1")
__import__("app_root.app1.models")

接下来,您调用import app_root并获取模块app_root,其中app_root.app1app_root.app1.models已由内部Django代码导入。

Django导入应用程序和模型的事实是Django内部机制,它未经记录并且可能在将来的版本中更改。我们认为您不应该在生产代码中依赖它,也不应该在PyCharm中使用。

这里是一个裸的Python示例(没有Django):

__import__("encodings.ascii")
import encodings
print (encodings.ascii.Codec) # this code works, but PyCharm marks "ascii" as "unknown module"

基本上,它不应该像import app_root那样工作,但是Django的一些特殊处理掩盖了这一点。


0
我遇到过类似的问题。我的解决方法是,在PyCharm首选项中为我的活动Python解释器添加了一个路径,即app_root的路径。

感谢您的评论。我已经将app_root和所有应用程序标识为“源根”,并选择了“将源根添加到PYTHONPATH”。我没有立即看到任何其他方法可以将app_root添加到我的Python解释器中(它似乎只允许在Python解释器设置下进行包安装)。 - IMFletcher
刚刚更新了最新的PyCharm版本,显然解释器有一些变化。他们删除了向解释器添加路径的可能性。 目前我只将app_root定义为源文件夹,还不确定这是否是解决方案。 - Blackeagle52

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接