django - 为什么 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 教程会教一些“显然”有问题并且“显然”你不应该做的事情。
解决方案
如果您遵循 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
的模块冲突,因此您的模块不能再引用包的项目。zipfile
zipfile
通过将这些嵌套在项目名称中,您可以将这些模块作为.from nameofawesomeproject.zipfile
import zipfile
然而,应用程序标签不会自动更改:应用程序的名称默认情况下是最深嵌套模块名称的名称,因此对于django.contrib.auth
,它是auth
. AppConfig
您可以通过为您的项目实现一个不同的名称。
推荐阅读
- android - 如何使用 JetPack Compose 在 LazyColumn 项目中单击导航到详细视图?
- python - 带有“for”循环和字典的动态 TCP 服务器
- python - Pandas 将 polyfit 应用于一个系列的值
- sql-server - 从 C# 应用程序执行存储过程时在 SQL Server 中创建的多个批处理
- flutter - 在另一个 dart 文件中声明 AppBar 并用另一个文件实例化它
- javascript - 从实时 Firebase 读取值
- .net-core - IronPython 在 Compile() 方法上不断崩溃。不知道如何解决
- android - Android WebView 流程未按预期工作
- laravel - 我如何使用 Laravel 关系来获得我想要的价值?
- pandas - 两个数据帧的每一行之间的自定义距离函数