首页 > 解决方案 > 为什么 Django REST Framework (DRF) 文件夹结构与 Django Turorial 不同?

问题描述

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

django-admin startproject mysite
# Change into the outer mysite directory
cd mysite
python manage.py startapp polls

你会得到这个文件夹结构

mysite/
├── manage.py
│
├── mysite/
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
│
└── pools/
    ├── migrations/
    │   └── __init__.py
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── models.py
    ├── tests.py
    └── views.py

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

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

# Create the project directory
mkdir mysite
cd mysite
# Set up a new project with a single application
django-admin startproject mysite .  # Note the trailing '.' character
cd mysite
django-admin startapp polls
cd ..

你会得到这个文件夹结构

mysite/
├── manage.py
│
└── mysite/
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    ├── wsgi.py
    │
    └── polls/
        ├── migrations/
        │   └── __init__.py
        ├── __init__.py
        ├── admin.py
        ├── apps.py
        ├── models.py
        ├── tests.py
        └── views.py

这是 DFR 的解释:

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

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

标签: djangodjango-rest-framework

解决方案


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

.
./manage.py
./tutorial
./tutorial/__init__.py
./tutorial/quickstart
./tutorial/quickstart/__init__.py
./tutorial/quickstart/admin.py
./tutorial/quickstart/apps.py
./tutorial/quickstart/migrations
./tutorial/quickstart/migrations/__init__.py
./tutorial/quickstart/models.py
./tutorial/quickstart/tests.py
./tutorial/quickstart/views.py
./tutorial/settings.py
./tutorial/urls.py
./tutorial/wsgi.py

如果我们把它放在树结构中,我们会看到:

.
├── manage.py
└── tutorial
    ├── __init__.py
    ├── quickstart
    │   ├── admin.py
    │   ├── apps.py
    │   ├── __init__.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

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

# Create the project directory
mkdir mysite
cd mysite

# Set up a new project with a single application
django-admin startproject mysite .
#  no cd mysite
django-admin startapp polls
cd ..

那么项目目录如下所示:

.
./manage.py
./tutorial
./tutorial/__init__.py
./quickstart
./quickstart/__init__.py
./quickstart/admin.py
./quickstart/apps.py
./quickstart/migrations
./quickstart/migrations/__init__.py
./quickstart/models.py
./quickstart/tests.py
./quickstart/views.py
./tutorial/settings.py
./tutorial/urls.py
./tutorial/wsgi.py

或者因此作为文件树:

.
├── manage.py
├── quickstart
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
└── tutorial
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

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

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

通过将这些嵌套在项目名称中,您可以将这些模块作为.from nameofawesomeproject.zipfileimport zipfile

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


推荐阅读