什么是Django
Django 是 Python 全栈式 Web 框架,以快速开发完整 Web 应用为目标,同时提供后端核心能力与前端渲染支撑。
1. 后端核心能力(核心职责)
- 处理业务逻辑:接收请求、校验数据、控制权限
- 数据管理:内置 ORM,免手写 SQL,完成数据库增删改查
- 提供接口:返回 HTML 页面 或 RESTful API
- 安全与通信:内置防攻击机制、认证会话,封装 HTTP 请求 / 响应
2. 对前端的支撑(非前端框架但提供配套)
- 模板渲染:DTL 模板引擎动态生成 HTML 页面
- 静态资源:统一管理 CSS/JS/ 图片,支持缓存与版本控制
- 表单能力:后端定义规则,自动生成表单并完成验证
- 自动后台:Admin 管理页面,一键实现数据管理
搭建项目
1. 虚拟环境
# Windows
python -m venv venv
# macOS/Linux
python3 -m venv venv
2. 激活虚拟环境
# Windows
venv\Scripts\activate
# macOS/Linux
source venv/bin/activate
3. 安装 Django
pip install django
4. 创建项目
方式一:命令行创建
django-admin startproject 项目名
方式二:PyCharm 创建
在 PyCharm 中新建项目时选择 Django 模板
配置文件
1. setting
要使用ORM类映射数据库,执行对应数据库操作,需先执行以下操作
- app注册
- 数据库选项
# Application definition INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "book", # 自定义应用 映射时需添加 "movie", ] # 数据库信息 以mysql为例 先建立名为db_douban的数据库 DATABASES = { "default": { "ENGINE": "django.db.backends.mysql", "NAME": "db_douban", "USER": "root", "PASSWORD": "你的密码", "HOST": "127.0.0.1", "PORT": "3306", } }
2. urls与views
Django 中 URL 路径通过路由映射绑定视图(views)函数,实现请求地址与业务逻辑的对应;
若主 urls.py 中路径过多,可在每个 app 下新建 urls.py 文件;
主路由通过 include () 将对应路径分发到各 app 的 urls 文件,实现路由拆分与解耦。
1.路由映射视图函数

2.路由拆分
主路由( DjangoProject\DjangoProject\urls.py)
urlpatterns = [
# 管理界面
path("admin/", admin.site.urls),
# 路由分发策略,将以book/开头的 URL 请求,转发到book应用下的urls.py文件中处理;
path("book/", include("book.urls", namespace="book")), # 映射子路由 命名空间
# 电影
path("movie/", include("movie.urls", namespace="movie")),
#
# 当 URL 规则较多时,通过这种 “主路由分发 + 应用独立路由” 的方式拆分,
# 可降低主路由复杂度,让 URL 管理更清晰
]
子路由( DjangoProject\book\urls.py)
from django.urls import path
from book import views
# 指定命名空间, 路由前缀
app_name = "book"
# 子路由规则列表
# 映射 “URL 路径” 到 “视图函数 / 类”。
urlpatterns = [
# 书籍列表
path("list", views.book_list, name="book_list"),
# 书籍详情
path("details/<book_id>/", views.book_detail, name="book_detail"),
# 添加分类
path(
"addcategory/", views.add_category, name="add_category"
), # 注意添加/ apifox对/ 敏感
# 添加书籍
path("addbook/", views.add_book, name="add_book"),
]
3. models 与 数据库映射(迁移)
类与表
- 在 ORM 框架中,models 里定义的类(ORM 对象)对应数据库中的一张表;
- 该类的一个实例(对象)对应表中的一行数据;
- 实例的一个属性对应该行数据中的一个字段。
class Book(models.Model):
"""
书籍模型类 继承自 models.Model
映射到数据库中,表名默认 应用名_类名
title:书名
author:作者
price:价格
pub_date:出版日期
"""
title = models.CharField(max_length=100, verbose_name="书名")
author = models.CharField(max_length=100, verbose_name="作者")
price = models.DecimalField(max_digits=5, decimal_places=2, verbose_name="价格")
pub_date = models.DateField(auto_now_add=True, verbose_name="出版日期")
# 外键关联
category = models.ForeignKey(
"Category", on_delete=models.CASCADE, verbose_name="分类"
)
# 模型元数据
class Meta:
db_table = "book"
verbose_name = "图书"
verbose_name_plural = verbose_name # 单复数一致
managed = False # 已有数据库表 不用管理当前模型类
# 分类模型类
class Category(models.Model):
name = models.CharField(max_length=100, verbose_name="分类名称")
description = models.TextField(verbose_name="描述")
外键
- 模型设计:category(一)和 book(多)是一对多关系,外键字段需定义在 book 表中,关联 category 的主键。
- 视图处理:接收前端传递的外键值(如 category_id)后,需先从 category 表查询出对应的 Category 实例,再将该实例赋值给 Book 对象的外键字段,而非直接赋值外键数值。
- 核心原因:Django ORM 中,外键字段存储的是关联模型的实例,而非单纯的数值,直接赋值数值会导致关联失效或报错。
# 视图处理
@csrf_exempt
def add_book(request):
"""
添加书籍
:param request:
:return:
"""
title = request.POST.get("title")
author = request.POST.get("author")
price = request.POST.get("price")
pub_date = request.POST.get("pub_date")
category = request.POST.get("category")
"""
Django外键赋值规则:外键字段需传入关联模型的实例,而非直接传 ID;
步骤为「取前端 ID→查模型实例→赋值给外键字段」;
需注意get方法的异常处理,避免因无效 ID 导致程序崩溃。
"""
category_obj = Category.objects.get(id=category)
# 传入参数 映射类的实例
book = Book(
title=title,
author=author,
price=price,
pub_date=pub_date,
category=category_obj,
)
book.save()
text = f"书籍:<{title}> 添加成功"
return HttpResponse(text)
相关命令
迁移命令:
检测model的变更,生成迁移配置文件:
python manage.py makemigrations
读取迁移配置文件,将模型变更同步到数据库:
python manage.py migrate
回滚:
#如果还没migrate,可以重新生成
rm -rf blog/migrations/
python manage.py makemigrations book 具体版本
#如果已经migrate,需要先回滚再重新生成
python manage.py migrate book zero
python manage.py makemigrations blog
python manage.py migrate book 0001_initial
演示
启动项目

apifox发送post请求

向数据库添加数据


1070

被折叠的 条评论
为什么被折叠?



