为什么 Django REST Framework (DRF) 文件夹结构与 Django Turorial 不同?

Uns*_*ble 8 django django-rest-framework

如果您遵循此处的Django 教程,您将运行以下命令:

\n
django-admin startproject mysite\n# Change into the outer mysite directory\ncd mysite\npython manage.py startapp polls\n
Run Code Online (Sandbox Code Playgroud)\n

你会得到这个文件夹结构

\n
mysite/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 manage.py\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 mysite/\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 asgi.py\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 settings.py\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 urls.py\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wsgi.py\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pools/\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 migrations/\n    \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 admin.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 apps.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 models.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tests.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 views.py\n
Run Code Online (Sandbox Code Playgroud)\n

但如果您遵循此处的Django REST Framework ,您将运行以下命令:

\n

注意:我替换了目录名称以匹配,以便更好地比较

\n
mysite/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 manage.py\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 mysite/\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 asgi.py\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 settings.py\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 urls.py\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wsgi.py\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pools/\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 migrations/\n    \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 admin.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 apps.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 models.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tests.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 views.py\n
Run Code Online (Sandbox Code Playgroud)\n

你会得到这个文件夹结构

\n
mysite/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 manage.py\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 mysite/\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 asgi.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 settings.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 urls.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 wsgi.py\n    \xe2\x94\x82\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 polls/\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 migrations/\n        \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 admin.py\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 apps.py\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 models.py\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tests.py\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 views.py\n
Run Code Online (Sandbox Code Playgroud)\n

这是 DFR 的解释:

\n
\n

应用程序是在项目目录中创建的,这可能看起来不寻常。使用项目的命名空间可以避免与外部模块的名称冲突(该主题超出了快速入门的范围)。

\n
\n

我想更多地了解这个“超出快速入门范围的主题”。我想阅读更多关于这个主题的内容并举一些例子。另外,为什么 Django 教程教的东西“显然”有问题并且“显然”你不应该做。

\n

Wil*_*sem 5

如果您遵循 Django REST 框架教程,您确实会得到您所描述的目录。在文档中我们看到文件结构如下所示:

\n
.\n./manage.py\n./tutorial\n./tutorial/__init__.py\n./tutorial/quickstart\n./tutorial/quickstart/__init__.py\n./tutorial/quickstart/admin.py\n./tutorial/quickstart/apps.py\n./tutorial/quickstart/migrations\n./tutorial/quickstart/migrations/__init__.py\n./tutorial/quickstart/models.py\n./tutorial/quickstart/tests.py\n./tutorial/quickstart/views.py\n./tutorial/settings.py\n./tutorial/urls.py\n./tutorial/wsgi.py\n
Run Code Online (Sandbox Code Playgroud)\n

如果我们将其放入树结构中,我们会看到:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 manage.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tutorial\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 quickstart\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 admin.py\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 apps.py\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 migrations\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 models.py\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tests.py\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 views.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 settings.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 urls.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wsgi.py\n
Run Code Online (Sandbox Code Playgroud)\n

但这与Django 教程使用的代码结构不同在这种情况下,我们使用以下命令创建项目结构:

\n
# Create the project directory\nmkdir mysite\ncd mysite\n\n# Set up a new project with a single application\ndjango-admin startproject mysite .\n#  no cd mysite\ndjango-admin startapp polls\ncd ..
Run Code Online (Sandbox Code Playgroud)\n

那么项目目录如下所示:

\n
.\n./manage.py\n./tutorial\n./tutorial/__init__.py\n./quickstart\n./quickstart/__init__.py\n./quickstart/admin.py\n./quickstart/apps.py\n./quickstart/migrations\n./quickstart/migrations/__init__.py\n./quickstart/models.py\n./quickstart/tests.py\n./quickstart/views.py\n./tutorial/settings.py\n./tutorial/urls.py\n./tutorial/wsgi.py\n
Run Code Online (Sandbox Code Playgroud)\n

或者作为文件树:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 manage.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 quickstart\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 admin.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 apps.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 migrations\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 models.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tests.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 views.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tutorial\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 settings.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 urls.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wsgi.py\n
Run Code Online (Sandbox Code Playgroud)\n

因此,您可以调用django-admin startapp polls目录,即外部 mysite目录,而不是内部 mysite.

\n

Django REST 框架建议使用这个额外层的原因是为了避免名称冲突。例如,如果您想命名一个 app ,那么这与包 [Python-docs]zipfile的模块发生冲突,因此您的模块无法再引用包的项目。zipfilezipfile

\n

通过将它们嵌套在项目名称中,您可以使这些模块作为 可用,因此您仍然可以使用该包。from nameofawesomeproject.zipfileimport zipfile

\n

然而,应用程序标签不会自动更改:应用程序的名称默认是最深嵌套模块名称的名称,因此对于django.contrib.auth,它是auth。您可以通过为您的项目实施来设置不同的名称AppConfig

\n