从零创建一个 Django 项目

作者:2601_96206525日期:2026/9/1

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 如果只是使用 SQLite,Django 默认支持,无需额外安装。* * ### 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.py init.py # 包标识 admin.py # 管理后台配置 apps.py # 应用配置 models.py # 数据模型定义 tests.py # 单元测试 views.py # 视图函数 * * ### 6. 配置应用打开 myproject/myproject/settings.py,在 INSTALLEDAPPS 中添加你的新应用: 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_length=20, primary_key=True) name = models.CharField(max_length=50) def str(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_key=True) username = models.CharField(max_length=100) 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(default=18) * 生成迁移文件以后,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.py:ASGI(异步服务器网关接口)配置,用于支持异步请求处理。* wsgi.py:WSGI(Web服务器网关接口)配置,用于部署 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_key=True) # 自增主键 username = models.CharField(max_length=45) # 用户名 password = models.CharField(max_length=45) # 密码 status = models.BooleanField(default=True) # 状态 (映射为 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}, safe=False) except Exception as e: return JsonResponse({‘status’: ‘error’, ‘message’: str(e)}, status=500) #### 步骤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 查询,并向数据库发送请求。你不需要手动书写 SQL,Django 会为你生成高效的 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)


《从零创建一个 Django 项目》 是转载文章,点击查看原文。


相关推荐


算法二叉树(一)
纪念 2292026/8/24

༺ 个人主页 · 纪念229 ༻ 🏠我的博客主页🏠 ༒专栏目录:《数据结构》༒ ༒专栏目录:《算法》༒ ༒专栏目录:《MySQL数据库》༒ ༒专栏目录:《前端开发》༒ ༒其它有趣的计算机知识༒ ༺世上本没有路,走的人多了自然就有了༻ 本节讲的是有关二叉树的OJ题,希望对你有所帮助 题目链接 二叉树前序遍历 二叉树中序遍历 二叉树的后序遍历 单值二叉树 对称二叉树 文章目录 1.二叉树前序遍历2.单值二叉树3.对称二叉树 文章开始前我与大家讨论一


AI agent学习之一基础知识
风之清扬2026/8/11

AI agent学习之一基础知识 一、基础知识案例1:获取 GitHub 用户粉丝数案例2:YAML文件的读写案例3:Git操作(git clone、commit和push)1)git clone2)先将修改文件暂存3)提交4)推送5)转换分支(checkout) 案例4:文件操作Linux端:Windows端: 案例5:API auth验证带token和不带token区别 AI agent的使用已经成为一个趋势,尽早入行才是王道。面对海量资料,如何入门确实是一个


Vue项目创建与入口配置全攻略
En^_^Joy2026/8/2

文章目录 一、vue项目创建二、入口界面配置 一、vue项目创建 创建项目:npm create vue@latest 执行后输入项目名(VueDemo),包名称(VueDemo),是否使用typeScript语法 E:\CODE\vueDemo>npm create vue@latest // 执行的指令 Need to install the following packages: create-vue@3.22.4 Ok to proceed? (y


C++ async 异步学习
小侯不躺平.2026/7/25

创建异步任务、延迟任务。任务或操作可以独立于主线程运行,主线程无需等待任务完成便可执行其他的任务,当异步的任务完成的时候可以通过某种机制获取其结果(std::future) 1、异步任务--async 正常使用环境 future.get #include<iostream> #include<thread> #include<chrono> #include<future> int task(int number) { // 抛出异常 或 返回正常结果 std::cout<


Spark 源码 | SparkSubmitArguments 参数解析(三)
董可伦2026/7/17

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:https://www.captainai.net/dongkelun 前言 在第二篇文章 Spark 源码 | SparkSubmit 提交流程分析(二) 中,我们分析了 SparkSubmit 的提交流程,其中 doSubmit 方法会调用 parseArguments 解析命令行参数。本文详细介绍参数解析的过程。 版本 Spark 3.2.3 SparkSubmitArguments


LeetCode 459. 重复的子字符串
Best_Jerry2026/7/9

leetcode.cn/problems/re… programmercarl.com/0459.%E9%87… 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。   示例 1: 输入: s = "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。 示例 2: 输入: s = "aba" 输出: false 示例 3: 输入: s = "abcabcabcabc" 输出: true 解释: 可由子串 "abc" 重复四次构成。 (或子串 "abc


HDFS javaAPI-windows的IDEA中java文件在linux中的hadoop平台运行
chde2Wang2026/7/1

目录 运行前提 一、在IDEA的Maven项目中创建MkDirDemo类 (1)先确认目录结构(Maven 标准目录,必须按这个来) (2)hdfs java操作代码输入 (3)验证pom.xml文件中hadoop依赖是否和linux中hadoop版本一致 (4)确认 HDFS RPC 地址(关键) 二、Windows 本地配置 Hadoop 运行环境(必做,否则报 winutils 缺失) (1)下载 Windows 适配 hadoop 二进制包Hadoop3.x 下载对应


Obsidian - 使用 Share Note 分享笔记并自部署
LinXunFeng2026/6/22

欢迎关注微信公众号:FSA全栈行动 👋 一、前言 最近在整理 Obsidian 笔记时,经常会遇到一个小需求:想把某一篇笔记快速分享给别人,但又不想为了它单独搭建博客、导出 PDF 或复制到其它平台。 如果只是分享纯文本,复制粘贴当然可以。但 Obsidian 笔记里往往会有这些内容: 图片附件 代码块 Callout 提示块 标签、任务列表 Dataview 查询结果 当前主题样式和自定义 CSS 笔记之间的内部链接 这时候手动搬运就有点麻烦了,格式容易丢,图片也要重新处理。这里介绍一


RabbitMQ 从入门到精通:Spring Boot 实战三部曲(一)—— 基础核心与快速上手
绝知此事2026/6/14

RabbitMQ 从入门到精通:Spring Boot 实战三部曲(一)—— 基础核心与快速上手 专题导读:本系列共三篇,从基础到高级,带你系统掌握 RabbitMQ 在 Spring Boot 项目中的实战应用。 第一篇:基础核心与快速上手(本文)第二篇:进阶特性与可靠性保障第三篇:高级应用与性能优化 📖 前言 在当今的分布式系统中,消息队列已成为不可或缺的基础设施。RabbitMQ 作为最流行的消息中间件之一,以其可靠性、灵活性和易用性著称。 本文将从 RabbitMQ 的基础概念出


iOS、Android、Flutter 2026 流行框架对比
王若风2026/6/7

参考文章:iOS、Android、Flutter 流行框架对比(原始链接) 我把我 2 年前的一篇博客文章进行了一次“重写”,于是有了这篇。 原文的选题很实用,结构也很清晰:按布局、网络请求、图片加载三个维度,把 iOS、Android、Flutter 常见框架放在一起横向看。 帮助移动端开发洞察各端核心框架的流行趋势,提供洞察和选项参考。 但原文的数据,放到 2026 年 6 月再看,已经有点过期了。 比如 Jetpack Compose 已经不是“新趋势”,而是 Android 新项目的

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读