资讯动态

从零创建一个 Django 项目

发布时间:2026/8/28 2:32:08 来源:尧图企业网站定制
1. 准备环境在开始之前确保你的开发环境满足以下要求* 安装了 Python (推荐 3.8 或更高版本)。* 安装pip包管理工具。* 如果要使用 MySQL 或 PostgreSQL确保对应的数据库已安装。#### 创建虚拟环境在项目目录中创建并激活虚拟环境保证项目依赖隔离 # 创建虚拟环境 python -m venv env # 激活虚拟环境 # Windows envScriptsactivate # Linux/Mac source env/bin/activate * *###2. 安装 Django 和数据库驱动在激活的虚拟环境中安装 Django pip install django 如果使用 MySQL 或 PostgreSQL还需要安装相应的驱动MySQL: 安装mysqlclient: pip install mysqlclient *PostgreSQL: 安装psycopg2: pip install psycopg2-binary 如果只是使用 SQLiteDjango 默认支持无需额外安装。* *###3. 创建 Django 项目使用django-admin创建一个新的项目 django-admin startproject myproject #### 项目结构创建后项目的基本结构如下 myproject/ manage.py # 项目管理脚本 myproject/init.py # 包标识 settings.py # 项目设置 urls.py # URL 配置 asgi.py # ASGI 配置 wsgi.py # WSGI 配置 * *###4. 配置数据库打开myproject/myproject/settings.py找到DATABASES配置项根据数据库类型修改配置#### 默认的 SQLite 配置 DATABASES { ‘default’: { ‘ENGINE’: ‘django.db.backends.sqlite3’, ‘NAME’: BASE_DIR / ‘db.sqlite3’, } } #### 使用 MySQL如果你使用 MySQL修改为 DATABASES { ‘default’: { ‘ENGINE’: ‘django.db.backends.mysql’, ‘NAME’: ‘your_database_name’, ‘USER’: ‘your_database_user’, ‘PASSWORD’: ‘your_database_password’, ‘HOST’: ‘localhost’, # 数据库主机地址通常是 localhost ‘PORT’: ‘3306’, # MySQL 默认端口 } } #### 使用 PostgreSQL如果你使用 PostgreSQL修改为 DATABASES { ‘default’: { ‘ENGINE’: ‘django.db.backends.postgresql’, ‘NAME’: ‘your_database_name’, ‘USER’: ‘your_database_user’, ‘PASSWORD’: ‘your_database_password’, ‘HOST’: ‘localhost’, # 数据库主机地址通常是 localhost ‘PORT’: ‘5432’, # PostgreSQL 默认端口 } } * *###5. 创建 Django 应用在项目目录中创建一个新的 Django 应用 python manage.py startapp myapp #### 应用结构创建后应用的结构如下 myapp/ migrations/ # 数据库迁移文件目录init.pyinit.py # 包标识 admin.py # 管理后台配置 apps.py # 应用配置 models.py # 数据模型定义 tests.py # 单元测试 views.py # 视图函数 * *###6. 配置应用打开myproject/myproject/settings.py在INSTALLED_APPS中添加你的新应用 INSTALLED_APPS [ # Django 自带的应用 ‘django.contrib.admin’, ‘django.contrib.auth’, ‘django.contrib.contenttypes’, ‘django.contrib.sessions’, ‘django.contrib.messages’, ‘django.contrib.staticfiles’, # 你的应用 ‘myapp’, ] * *###7. 创建模型并生成数据库表在myapp/models.py中定义数据模型。例如 from django.db import models class Lesson(models.Model): id models.CharField(max_length20, primary_keyTrue) name models.CharField(max_length50) defstr(self): return self.name #### 生成迁移文件运行以下命令生成迁移文件 python manage.py makemigrations Django 会检测到模型更改并生成迁移文件例如 Migrations for ‘myapp’: myapp/migrations/0001_initial.py - Create model Lesson #### 应用迁移文件运行以下命令将迁移文件应用到数据库生成表结构 python manage.py migrate #### 生成并应用迁移文件的目的将模型定义和数据库表结构同步确保模型中的字段和属性能够在数据库中对应为实际的表和列##### 迁移文件的作用迁移文件是 Django 提供的一种机制用于跟踪和记录数据模型的变化然后将这些变化应用到数据库中。**作用1**将模型转换为数据库表 在 models.py 中定义的模型只是 Python 的类它们描述了表的结构如字段、类型、约束等但它们并不会自动创建数据库中的实际表。 * 迁移文件将这些模型转化为一组可以执行的指令SQL 语句以在数据库中创建实际的表。举例 在models.py中定义 from django.db import models class User(models.Model): id models.AutoField(primary_keyTrue) username models.CharField(max_length100) email models.EmailField() * 迁移文件会生成相应的SQL语句 CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(100) NOT NULL, email VARCHAR(254) NOT NULL ); * **作用2**跟踪和管理模型的变更 当你对 models.py 中的模型做出修改如新增字段、修改字段类型、删除字段等时Django 会通过迁移文件记录这些变化。应用迁移文件后Django 会将这些更改同步到数据库中而不会丢失现有数据。举例假设你为User模型添加了一个新的字段age age models.IntegerField(default18) * 生成迁移文件以后Django会创建一个指令来添加字段 ALTER TABLE user ADD COLUMN age INT NOT NULL DEFAULT 18; * **作用3**管理多开发者协作中的数据库一致性 在多人开发时每个开发者可能对模型进行不同的更改通过迁移文件可以记录这些更改并在团队中共享。迁移文件以增量的形式记录每次更改确保所有开发者和环境中的数据库表结构保持一致。###8. 运行开发服务器使用以下命令启动 Django 开发服务器 python manage.py runserver 打开浏览器访问http://127.0.0.1:8000/ 以查看项目是否正常运行。* *###9. 添加管理后台支持如果需要通过 Django 的管理后台管理数据库可以为模型添加管理支持。#### 注册模型打开myapp/admin.py注册模型 from django.contrib import admin from .models import Lesson admin.site.register(Lesson) #### 创建超级用户运行以下命令创建管理员账户 python manage.py createsuperuser 按照提示输入用户名、邮箱和密码。#### 访问管理后台启动开发服务器后访问 http://127.0.0.1:8000/admin使用管理员账户登录即可管理数据库中的数据。*###10. 测试操作数据库可以通过manage.py shell交互式操作数据库 python manage.py shell 在交互环境中 from myapp.models import Lesson # 创建记录 lesson Lesson.objects.create(id‘1’, name‘Django Basics’) # 查询记录 lesson Lesson.objects.get(id‘1’) print(lesson.name) # 更新记录 lesson.name ‘Advanced Django’ lesson.save() # 删除记录 lesson.delete() * *###总结通过以上步骤你可以从零创建一个 Django 项目并设置数据库支持。核心流程包括1. 安装 Django 和数据库驱动。2. 配置数据库连接。3. 创建应用和模型。4. 生成并应用迁移文件。5. 运行开发服务器并使用 Django 提供的管理后台。### 项目结构解读#### env文件夹概念env 文件夹是一个 虚拟环境 的文件夹。什么是虚拟环境【虚拟环境是 Python 提供的一种工具用于隔离项目的依赖。它允许你在每个项目中独立安装 Python 包而不会干扰全局 Python 环境或其他项目的依赖。】* 为什么需要虚拟环境 * 依赖隔离每个项目可能需要不同版本的库如果不使用虚拟环境可能会导致版本冲突。 *防止污染全局环境全局环境中的库安装可能会影响其他项目的正常运行。* env文件夹的作用 * 环境隔离当你激活虚拟环境时所有安装的依赖包如 Django都被存储在 env 文件夹中。 * 存储依赖包例如你安装的 Django 和 MySQL 驱动等依赖都会存储在 env/Lib/site-packages 下。* 激活虚拟环境window envScriptsactivate * 激活虚拟环境Linux/Mac source env/bin/activate * 关闭虚拟环境 deactivate #### 项目目录结构以及Django项目开发注意点 myproject/ manage.py myproject/init.py settings.py urls.py asgi.py wsgi.py myapp/ migrations/init.py admin.py apps.py models.py tests.py views.py ##### manage.py* 概念manage.py 是 Django 项目的入口点。它是一个命令行工具允许你管理项目如运行开发服务器、数据库迁移等。常见的命令包括* 启动开发服务器 python manage.py runserver * 创建数据库迁移 python manage.py makemigrations python manage.py migrate * 创建超级用户 python manage.py createsuperuser ##### myproject/同名的文件夹* 概念这个文件夹是Django项目的配置文件夹它的名字和项目名一致* settings.py项目的核心配置文件包括数据库配置、已安装的应用、静态文件路径等。* urls.py项目的 URL 路由配置文件用于将 URL 路径映射到对应的视图函数。* asgi.pyASGI异步服务器网关接口配置用于支持异步请求处理。* wsgi.pyWSGIWeb服务器网关接口配置用于部署 Django 项目到生产环境。##### myapp创建的应用目录* myapp/ 是你创建的应用目录。Django 项目可以包含多个应用每个应用负责不同的功能模块。* 各文件的作用 * models.py定义数据模型数据库表结构。 * views.py处理用户的请求并返回响应。 * admin.py配置管理后台Django admin。 * apps.py管理应用的配置信息。 * migrations/存储数据库迁移文件用于跟踪模型的变化。 * tests.py定义测试用例用于自动化测试。 *init: 标识这是一个Python包 文件夹可以被 Python 识别为模块##### 为什么 myproject 文件夹下有一个和项目同名的文件夹* 这是Django项目默认的目录结构 * 最外层的 myproject/ 是项目的根目录存放项目入口点 manage.py 和其他项目相关的文件。 * 内层的 myproject/ 是项目的 配置文件夹存放项目的配置如 settings.py、urls.py 等。* 这样设计的目的 * Django 这样设计的原因是为了方便管理项目的全局文件和应用文件。分开这两层结构可以更清晰地区分项目的配置文件和其他文件。##### 修改项目名称会影响哪些地方* 如果你需要修改项目名称内层文件夹myproject中的配置文件需要同步更新。例如 * asgi.py 和 wsgi.py 中引用的模块路径需要修改。 * 项目运行时的模块路径也需要更新。##### 如何添加更多的应用到项目中* Django 支持模块化的开发可以为项目添加多个应用每个应用负责不同的功能。* 创建新的应用使用startapp命令创建新应用例如 python manage.py startapp blog * 1. 注册应用将新应用注册到项目的INSTALLED_APPS中 # settings.py INSTALLED_APPS [ # 默认应用 ‘django.contrib.admin’, ‘django.contrib.auth’, ‘django.contrib.contenttypes’, ‘django.contrib.sessions’, ‘django.contrib.messages’, ‘django.contrib.staticfiles’, # 你的自定义应用 ‘myapp’, ‘blog’, ] * 2. 添加URL路由为新应用配置URL例如在新应用blog中创建urls.py # blog/urls.py from django.urls import path from . import views urlpatterns [ path(‘’, views.index, name‘index’), # 主页 ] * 3. 在项目的urls.py中包含这个应用的URL # myproject/urls.py from django.contrib import admin from django.urls import path, include urlpatterns [ path(‘admin/’, admin.site.urls), path(‘blog/’, include(‘blog.urls’)), # 包含 blog 的路由 ] ##### 项目结构总结* env 文件夹是虚拟环境的文件夹用于隔离项目依赖。* 项目结构 * 外层 myproject/ 是根目录存放入口文件如 manage.py。 * 内层 myproject/ 是项目的配置文件夹存放 settings.py 等配置。 * myapp/ 是一个应用目录你可以创建多个应用每个应用负责不同的功能模块。* 模块化开发 * Django 项目可以包含多个应用通过 startapp 命令创建新应用并通过 INSTALLED_APPS 注册到项目中。### 编辑数据库时是否需要书写models.py文件#### 1. 使用models.py的场景* 在大多数情况下推荐通过models.py 文件来定义和操作数据库这是 Django 的核心功能之一。* 优点 * **ORM提供抽象层**通过Django的ORM对象关系映射你可以直接使用Python类和方法操作数据库而无需手写SQL * **数据变更自动管理:**通过迁移migrations功能可以轻松跟踪和管理数据库结构的变更。 *代码可维护性强models.py 中的类定义直接对应数据库表代码更直观、更易维护。 * **跨数据库支持**通过 Django 的 ORM同一套代码可以适配不同的数据库如 SQLite、MySQL、PostgreSQL。#### 2. 直接操作数据库的场景无需models.py##### 场景1已有数据库表* 如果你的项目需要操作一个已有的数据库非 Django 管理的表你可以直接通过 SQL 或第三方库操作它而不定义模型。* 也可以使用Django的inspectdb功能自动生成模型##### 场景2复杂SQL查询* 如果某些操作难以通过 ORM 实现例如复杂的联表查询、多级嵌套查询等可以直接使用 SQL 查询。##### 场景3一次性脚本或数据迁移* 如果只是临时操作数据库如迁移数据、批量更新等可以直接运行原生 SQL而不需要定义模型。### 利用Django操作数据库编写接口* 目的想要获取my_db_01数据库下的users表中的所有用户数据#### 步骤1在myproject文件夹下的settings.py文件中配置数据库信息 DATABASES { ‘default’: { ‘ENGINE’: ‘django.db.backends.mysql’, # 使用 MySQL 驱动 ‘NAME’: ‘my_db_01’, # 数据库名 ‘USER’: ‘your_mysql_username’, # MySQL 用户名 ‘PASSWORD’: ‘your_mysql_password’, # MySQL 密码 ‘HOST’: ‘localhost’, # 数据库主机通常是 localhost ‘PORT’: ‘3306’, # MySQL 默认端口 } } #### 步骤2定义users表的类型 方法一* Django中可以操作多个应用* 打开myapp/models.py并定义User模型 from django.db import models class User(models.Model): id models.AutoField(primary_keyTrue) # 自增主键 username models.CharField(max_length45) # 用户名 password models.CharField(max_length45) # 密码 status models.BooleanField(defaultTrue) # 状态 (映射为 TINYINT(1)) class Meta: db_table ‘users’ # 映射到 MySQL 中的 users 表 managed False # 告诉 Django 不去管理创建/迁移此表 #### 步骤3编写视图获取所有用户信息* 在 myapp/views.py 中编写一个视图函数用于获取 users 表的所有记录 from django.http import JsonResponse from .models import User def get_all_users(request): try: # 查询所有用户 users User.objects.all().values(‘id’, ‘username’, ‘password’, ‘status’) users_list list(users) # 转换为列表以便返回 JSON 响应 return JsonResponse({‘status’: ‘success’, ‘data’: users_list}, safeFalse) except Exception as e: return JsonResponse({‘status’: ‘error’, ‘message’: str(e)}, status500) #### 步骤4配置URL路由* 在myapp/urls.py 中添加路由让接口与视图函数关联 from django.urls import path from .views import get_all_users urlpatterns [ path(‘users/’, get_all_users, name‘get_all_users’), # 绑定接口到视图函数 ] * 然后在主项目中的urls.py中包含myapp路由即可 from django.urls import path from .views import get_all_users urlpatterns [ path(‘users/’, get_all_users, name‘get_all_users’), # 绑定接口到视图函数 ] #### 步骤5测试接口浏览器/postman都可### 操作数据库的时候为啥没有直接书写SQL代码* 使用了Django ORM对象关系映射Object-Relational Mapping它是 Django 提供的一个强大的抽象工具用于代替直接写 SQL 语句来操作数据库。#### Django ORM的工作原理* 模型与数据库表的映射 * 在 models.py 中定义的 User 模型对应的是数据库中的 users 表。 * **Django会根据模型自动生成SQL语句来增删改查数据库 *** Django ORM 方法与 SQL 的关系 * 当你使用 ORM 的方法如 User.objects.all()时Django 会在内部转换成对应的 SQL 查询并向数据库发送请求。你不需要手动书写 SQLDjango 会为你生成高效的 SQL 查询。* 例如 users User.objects.all().values(‘id’, ‘username’, ‘password’, ‘status’) # 相当于sql SELECT id, username, password, status FROM users; #### Django ORM的优势* 提高开发效率通过 Python 代码实现数据库操作无需手动编写 SQL。* 跨数据库兼容性同一段代码可以在不同数据库如 SQLite、MySQL、PostgreSQL上运行Django 自动生成对应数据库的 SQL。* 安全性Django ORM 内部会自动处理一些常见的安全问题如 SQL 注入。### 使用raw() 方法来执行自定义SQL#### 方法1* 如果需要执行更复杂的SQL查询联表查询、子查询 可以使用raw()方法 from django.db import connection from .models import User def get_all_users_raw(request): with connection.cursor() as cursor: cursor.execute(“SELECT id, username, password, status FROM users”) rows cursor.fetchall() users_list [ {‘id’: row[0], ‘username’: row[1], ‘password’: row[2], ‘status’: row[3]} for row in rows ] return JsonResponse({‘status’: ‘success’, ‘data’: users_list}) #### 方法2使用raw()和ORM* 可以结合ORM的raw()方法来直接执行SQL查询即将SQL语句直接放到raw()中 具体效果如下 users User.objects.raw(“SELECT id, username, password, status FROM users”) for user in users: print(user.username)

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价