一、关于ORM
ORM 是啥呀
ORM 就是用 面向对象 的方式,把数据库里的数据还有它们之间的关系映射起来~就好像给数据库和面向对象之间搭了一座小桥梁🎀
对应关系大揭秘
面向对象和数据库里的东西,有超有趣的对应呢👇
- 类 → 数据库里的 表
就像类是个小模具,能做出好多实例对象~表也是数据库里存数据的小容器呀,存着好多记录哒🥰 - 属性 → 表的 字段
属性是类里描述东西的小特性,字段就是表里面每一列的小身份,规定了存啥样的数据哟~像 “姓名”“年龄” 这种✨ - 方法 → 对数据的 操作
方法是类里能做的小功能,比如 “计算”“修改”~对应到数据库里,就是对数据增删查改这些操作啦,像给数据换件新衣服一样👗 - 实例对象 → 表的 记录
实例对象是类造出来的具体 “小家伙”,记录就是表里面一行一行的数据~比如一条学生信息,就是一个可爱的小记录呀📝
ORM 超棒的好处呀
用 ORM 来操作数据库(增删查改),不用写 SQL 语句,靠面向对象的代码就好啦,好处多多哒🥳
- 降低难度
不用费劲记复杂的 SQL 语法啦,用熟悉的面向对象代码,像玩游戏一样操作数据库,简单又快乐🎮 - 减少失误
代码更规整,不容易写错~就像走在铺好的小路上,不容易摔跤出错哟👣 - 兼容多种数据库
不管是 MySQL、PostgreSQL,还是 MariaDB、Sqlite3 这些数据库小伙伴,ORM 都能友好相处~不用为换数据库重新学一堆新东西,超省心哒💖
二、创建Model
class Feedback(models.Model)
这行代码,就是在定义一个 数据库表的 “蓝图” 。在 Django 里,继承 models.Model
的类,会对应数据库中的一张表,用来存数据~
1. 类定义
class Feedback(models.Model): # 数据库中: 表
class Feedback
:定义了一个叫Feedback
的类,它就像一个 “模具”,决定了数据库表长啥样。(models.Model)
:继承 Django 提供的models.Model
类,这样 Django 才会把这个类识别成数据库模型,帮我们和数据库打交道~- 注释
# 数据库中: 表
:说明这个类对应数据库里的一张表,表名默认是小写的类名(比如这里可能对应feedback
表,Django 会自动处理命名规则 )。
2. 字段定义(对应数据库的列)
下面这些代码,是给表定义 字段(列) ,规定存啥数据、怎么存~
quality = models.IntegerField('商品质量', default=1) # 数据库: 字段
quality
:是字段名,你可以理解成 “列的名字”,存商品质量相关的数据。models.IntegerField
:说明这个字段存 整数 类型的数据(比如 1、2、3… 用来打分很方便 )。'商品质量'
:是给这个字段起的 “中文别名”,方便看代码时知道它干啥用的(数据库里实际存的是quality
,但开发时看别名更直观 )。default=1
:如果创建数据时没给这个字段赋值,就默认填1
(比如用户没打分,默认给 1 分 )。
同理,下面这几个字段逻辑差不多:
attitude = models.IntegerField('客服态度', default=1) # 数据库: 字段
speed = models.IntegerField('物流速度', default=1) # 数据库: 字段
attitude
存 “客服态度” 的整数评分,speed
存 “物流速度” 的整数评分,默认都是1
分~
text = models.TextField('评论内容', max_length=150, default="") # 数据库: 字段
text
:字段名,存用户的评论内容。models.TextField
:存 长文本 (比如用户写的一段评价 )。'评论内容'
:中文别名,方便理解。max_length=150
:限制最多写 150 个字符,避免评论太长~default=""
:没写评论的话,默认存空字符串。
anonymous = models.BooleanField('是否匿名', default=True) # 数据库: 字段
anonymous
:字段名,存 “是否匿名” 的状态。models.BooleanField
:存 布尔值 (True 或 False ,也就是 “是” 或 “不是” )。'是否匿名'
:中文别名。default=True
:默认 “匿名”(创建数据时,没选的话就默认匿名 )。
3. 普通属性(和数据库无关)
name: str = 'bf' # 普通的属性
objects: models.QuerySet # 普通的属性
Python 的 :
是类型注解
name: str = 'bf'
:这是 普通的类属性 ,和数据库表的字段没关系!它就是这个Feedback
类里的一个变量,存个字符串'bf '
,可能是开发时临时用的,不会同步到数据库里~objects: models.QuerySet
:也是普通属性(不过实际开发中,Django 会自动给模型类加objects
,用来操作数据库,比如查询数据。这里提前标注类型,让代码更清晰 ),同样和数据库表的结构无关,是 Python 代码里用的~
models.QuerySet
就像一个 魔法小篮子 🧺,专门装从数据库里 “捞” 出来的宝贝数据哟~
它超能干的!✨
挑挑拣拣 🔍
比如想找出所有 “商品质量” 大于 3 分的反馈?
喊它一声:Feedback.objects.filter(quality__gt=3)
它就会变出一个装着符合条件数据的小篮子,超乖~排排坐 🔄
想按 “物流速度” 从快到慢排好队?
告诉它:Feedback.objects.order_by('-speed')
它就会把数据整整齐齐排好,像小士兵一样~算一算 🧮
想知道大家给的 “客服态度” 平均分?
拜托它:Feedback.objects.aggregate(Avg('attitude'))
它立马算出结果,像个小计算器~
小秘密哦 🤫
- 懒羊羊属性 😴:你让它准备篮子时,它才不着急去找数据呢~ 等到你真的要 “看” 里面的东西(比如遍历、打印),它才嗖地一下跑去数据库拿,超会摸鱼~
- 连环魔法 🔗:可以让它先挑拣再排序,比如
filter(...).order_by(...)
,像玩积木一样拼操作,超灵活~
总之呀,QuerySet
就是帮我们和数据库 “对话” 的小可爱 🗣️,想要啥数据,跟它说一声就好啦~ 是不是超棒!🥳
总结一下
- 这个
Feedback
类对应数据库里一张表,存用户反馈数据(商品质量、客服态度、物流速度评分,评论内容,是否匿名 )。 - 继承
models.Model
后,Django 会帮我们把类转换成数据库表,字段对应表的列,不用手动写 SQL 建表啦~ - 普通属性(像
name
、objects
)是 Python 代码里自己用的,和数据库表结构没关系~
三、迁移数据库
迁移是干啥哒?
迁移(migrations)就像个 “代码→数据库” 的翻译官~💬
把咱们写的 Model
代码(比如之前的 Feedback
类),变成数据库能听懂的 “指令”,让数据库真的长出对应的表、字段!
简单说:把 Python 里的模型设计,同步到真实数据库里生效~ ✨
四大迁移命令
1. makemigrations
👉 写 “迁移剧本”
makemigrations 基于模型的修改创建迁移。
- 作用:当你改了
Model
(比如新增字段、改默认值),它会帮你写一个 “迁移剧本”📝
就像记录:“这次要给数据库表加个新字段啦~”“那个字段默认值要变哟~” - 举例:
你给Feedback
加了个phone = models.CharField('电话', max_length=20)
,跑makemigrations
,它就生成一个包含 “新增phone
字段” 的迁移文件!
2. showmigrations
👉 看 “迁移进度”
showmigrations 列出项目的迁移和迁移的状态。
- 作用:查看所有迁移文件的状态~ 👀
能看到哪些迁移已经 “applied(应用到数据库了)”,哪些还 “ pending(等着执行)” - 场景:
想知道 “之前改的模型同步到数据库没?” 跑它就知道啦!像查快递进度一样~
3. sqlmigrate
👉 看 “翻译后的 SQL”
sqlmigrate 展示迁移使用的 SQL 语句。
- 作用:把 “迁移剧本” 翻译成数据库能懂的 SQL 语句~(比如
CREATE TABLE
、ALTER TABLE
这些)
相当于让你 “偷看” 迁移背后的 SQL 魔法咒语!🪄 - 用法:
比如有个迁移文件0001_initial.py
,跑sqlmigrate 你的应用名 0001
,就能看到它要执行哪些 SQL~
4. migrate
👉 执行 “迁移剧本”
migrate 负责应用和撤销迁移。
- 作用:真正把 “迁移剧本” 应用到数据库!让修改 生效~ ✅
也能撤销迁移(比如回退到之前的版本) - 常用场景:
- 第一次同步模型:
migrate
会创建所有表 - 改了模型后:先
makemigrations
写剧本,再migrate
执行剧本,数据库就跟着变啦~
- 第一次同步模型:
简化命令(pdm 玩家专属!)
pdm run init
- 这是用
pdm
包管理工具时,简化的 “一键迁移” 命令~ 🚀
可能背后帮你自动执行makemigrations
+migrate
这些步骤(具体看项目配置),让你少敲命令,超省心!
迁移流程小剧场🎬
假设你新建了 Feedback
模型:
- 写好
Model
代码 → 跑makemigrations
→ 生成 “创建Feedback
表” 的迁移文件 - 跑
migrate
→ 数据库执行 SQL,真的创建出feedback
表! - 后来你给
Feedback
加了个字段 → 再跑makemigrations
(生成 “加字段” 的迁移文件)→ 跑migrate
(数据库表真的多了这个字段)
manage.py 是啥
manage.py
是 Django 项目创建时就自带的一个 Python 脚本。它封装了很多常用的管理命令,你不需要去记那些命令具体在哪个模块,只要通过 manage.py
,再加上对应的子命令,就能完成各种操作。比如:
- 创建新的应用:可以运行
python manage.py startapp 应用名
,就像变魔法一样,帮你快速创建一个新的 Django 应用,里面自动生成一些基础的文件结构。 - 启动开发服务器:使用
python manage.py runserver
,就能启动本地的开发服务器,方便你在开发过程中预览项目效果,不用手动去配置服务器相关的复杂操作。
为什么要通过 manage.py 执行 migrate
migrate
这个子命令,作用是把前面提到的迁移文件应用到数据库中,让数据库的结构和你的模型定义保持一致。
manage.py
知道整个 Django 项目的配置信息,比如数据库连接配置、项目里有哪些应用等。当你运行 python manage.py migrate
时:
- 识别配置:它会读取项目的
settings.py
文件,了解到你使用的是哪种数据库(是 MySQL 、PostgreSQL 还是 SQLite 等 ),以及数据库的连接信息。这样它就能知道要把迁移应用到哪个数据库上。 - 定位迁移文件:它会遍历项目里所有应用,找到那些通过
makemigrations
命令生成的迁移文件,清楚哪些迁移还没有应用到数据库中。 - 执行迁移:根据迁移文件的顺序,按照正确的步骤把迁移应用到数据库,完成数据库结构的更新,比如创建表、修改字段等操作。
举个超形象的例子🤩:
把 Django 项目比作一个 “魔法城堡”,manage.py
就是城堡的 “大总管”,migrate
是它的一个 “魔法指令”。
当你喊出 python manage.py migrate
,大总管就会拿着城堡的 “地图”(配置信息),找到那些 “魔法卷轴”(迁移文件),然后按照卷轴上的指示,在城堡的 “宝物库”(数据库)里施展魔法,让宝物库的布局(数据库结构)和城堡主人(开发者)的想法一致~是不是很好理解啦😉。
四、 Django View 里操作 Model 的代码
「数据入库小剧场」🎬
整体干啥的?
把用户 / 前端传来的数据,装进 Feedback
模型里,然后 “存进数据库” !就像把零散的乐高零件,拼成一个完整的模型,再放进展示柜~
1. obj = Feedback()
- 这行是 “创建一个空的 Feedback 数据对象” ~
Feedback
是咱们定义的模型类(像个模具),obj
就是用模具做出来的 空数据盒子 ,等着装数据啦~ - 类比:用 “Feedback 模具” 捏一个空白的小泥人,后面要给它填五官、衣服~
2. obj.quality = data['quality']
- 这行是 “给 obj 的 quality 字段赋值” ~
obj.quality
:对应模型里的quality
字段(商品质量评分)。data['quality']
:假设data
是前端 / 用户传来的字典数据(比如表单、API 请求),这里取quality
对应的值,塞给obj
~- 类比:给小泥人画眼睛,眼睛的颜色从
data
里选~
3. obj.attitude = data['attitude']
- 同理!给
obj
的attitude
字段(客服态度评分)赋值~ - 继续给小泥人画嘴巴,嘴巴的形状从
data
里拿~
4. obj.speed = data['speed']
- 给
obj
的speed
字段(物流速度评分)赋值~ - 给小泥人穿衣服,衣服的样式从
data
里挑~
5. obj.text = data['text']
- 给
obj
的text
字段(评论内容)赋值~ - 给小泥人写名字,名字内容从
data
里取~
6. obj.anonymous = data['anonymous']
- 给
obj
的anonymous
字段(是否匿名)赋值~ - 决定小泥人要不要戴 “匿名面具”,面具状态从
data
里拿~
7. obj.save()
# 入库
- 这行是 “把 obj 存进数据库” !
前面给obj
填了所有字段,现在调用save()
方法,Django 就会帮我们把这个obj
转换成 数据库的一条记录 ,永久保存~ - 类比:把拼好的乐高模型、画好的小泥人,放进 “数据库展示柜” 里啦!
小总结(剧情回顾)
用 Feedback()
造一个空数据盒子 obj
→ 从 data
里把数据一个个塞进 obj
的字段里
→ 调用 save()
把 obj
存进数据库~
五、Django Admin 关联 Model 的完整流程
让你的模型在后台 “可视化管理”~ 就像给模型办一张 “后台通行证”🎫
核心目的
Django Admin 是 Django 自带的 可视化后台管理工具 !把 Model
注册到 Admin 后,就能在后台页面里 直观地增删改查数据 ,不用写 SQL 或自己做页面~
比如你做了个 Feedback
模型(存用户反馈),注册到 Admin 后,就能在后台像用 Excel 一样管理这些数据啦!
注册 Model 到 Admin 的步骤
1. 准备工作:确保 App 已加入项目
在项目的 settings.py
里,你的 App(比如 beifan
)要在 INSTALLED_APPS
里~ 否则 Django 找不到你的模型!
INSTALLED_APPS = [...'yifei', # 你的 App 名称...
]
2. 写 Admin 注册代码(关键!)
在你的 App 目录下(比如 beifan/admin.py
),写下面的代码:
from django.contrib import admin
from .models import Feedback # 导入你的模型# 方式1:装饰器注册(推荐!)
@admin.register(Feedback)
class FeedbackAdmin(admin.ModelAdmin):# 这里可以定制后台显示的样子,比如列表显示哪些字段、搜索框、过滤条件等list_display = ('quality', 'attitude', 'speed', 'text', 'anonymous') # 列表页显示的字段search_fields = ('text',) # 搜索框,搜评论内容list_filter = ('anonymous',) # 过滤条件,按是否匿名筛# 方式2:传统注册(和装饰器选一种即可)
# admin.site.register(Feedback, FeedbackAdmin)
代码拆解:
@admin.register(Feedback)
:这是个 装饰器 ,作用是 “把Feedback
模型交给FeedbackAdmin
管理”~class FeedbackAdmin(admin.ModelAdmin)
:继承admin.ModelAdmin
,可以定制后台的显示、操作逻辑。list_display
:后台列表页显示哪些字段(像表格的列)。search_fields
:加个搜索框,搜哪些字段。list_filter
:侧边栏加过滤条件,方便筛数据。
3. 运行开发服务器,登录后台
- 启动服务器:
python manage.py runserver
- 访问后台:浏览器打开
http://127.0.0.1:8000/admin
,用超级用户(superuser)登录(没有的话用python manage.py createsuperuser
创建)。
4. 享受可视化管理!
登录后,左边侧边栏会出现你的 Feedback
模型~ 点进去就能:
- 点 Add 按钮 → 像填表单一样新增数据!
- 列表页能看到所有数据,还能搜索、过滤~
- 点每条数据 → 编辑、删除都可以!
Django Admin 界面:
- 左边 YIFEI分组下有
Feed backs
→ 说明Feedback
模型已成功注册! - 绿色提示
The feedback "Feedback object (4)" was added successfully.
→ 刚新增了一条数据,成功入库~ - 列表里的
Feedback object (4)
→ 是一条数据,因为没定制__str__
方法,默认显示模型名 object (ID)
。可以在模型里加一行让它更友好:
class Feedback(models.Model):# 你的字段...def __str__(self):return f"反馈{self.id}:{self.text[:10]}" # 显示 ID 和评论前10个字
进阶定制(可选玩)
想让后台更炫酷?可以继续加这些配置:
@admin.register(Feedback)
class FeedbackAdmin(admin.ModelAdmin):list_display = ('quality', 'attitude', 'speed', 'text', 'anonymous', 'created_time')list_per_page = 20 # 每页显示20条readonly_fields = ('created_time',) # 某些字段只读(比如自动生成的时间)fieldsets = ( # 分组显示编辑页的字段('评分信息', {'fields': ('quality', 'attitude', 'speed')}),('评论信息', {'fields': ('text', 'anonymous')}),)
这样后台编辑页面会分组显示字段,更清晰!
总结流程
- 确保 App 在
INSTALLED_APPS
→ - 在
admin.py
用@admin.register
注册模型 + 定制显示 → - 启动服务器,登录后台 →
- 愉快地增删改查!
整个过程就像:给你的模型办一张 “后台 VIP 卡” ,让它能在 Django Admin 里被可视化管理🎉