当前位置: 首页 > news >正文

【Django】-4- 数据库存储和管理

一、关于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 就像一个 魔法小篮子 🧺,专门装从数据库里 “捞” 出来的宝贝数据哟~

它超能干的!✨

  1. 挑挑拣拣 🔍
    比如想找出所有 “商品质量” 大于 3 分的反馈?
    喊它一声:Feedback.objects.filter(quality__gt=3)
    它就会变出一个装着符合条件数据的小篮子,超乖~

  2. 排排坐 🔄
    想按 “物流速度” 从快到慢排好队?
    告诉它:Feedback.objects.order_by('-speed')
    它就会把数据整整齐齐排好,像小士兵一样~

  3. 算一算 🧮
    想知道大家给的 “客服态度” 平均分?
    拜托它: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 TABLEALTER TABLE 这些)
    相当于让你 “偷看” 迁移背后的 SQL 魔法咒语!🪄
  • 用法:
    比如有个迁移文件 0001_initial.py,跑 sqlmigrate 你的应用名 0001,就能看到它要执行哪些 SQL~

4. migrate 👉 执行 “迁移剧本”

migrate  负责应用和撤销迁移。

  • 作用:真正把 “迁移剧本” 应用到数据库!让修改 生效~ ✅
    也能撤销迁移(比如回退到之前的版本)
  • 常用场景:
    • 第一次同步模型:migrate 会创建所有表
    • 改了模型后:先 makemigrations 写剧本,再 migrate 执行剧本,数据库就跟着变啦~

简化命令(pdm 玩家专属!)

pdm run init

  • 这是用 pdm 包管理工具时,简化的 “一键迁移” 命令~ 🚀
    可能背后帮你自动执行 makemigrations + migrate 这些步骤(具体看项目配置),让你少敲命令,超省心!

迁移流程小剧场🎬

假设你新建了 Feedback 模型:

  1. 写好 Model 代码 → 跑 makemigrations → 生成 “创建 Feedback 表” 的迁移文件
  2. 跑 migrate → 数据库执行 SQL,真的创建出 feedback 表!
  3. 后来你给 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')}),)

这样后台编辑页面会分组显示字段,更清晰!

总结流程

  1. 确保 App 在 INSTALLED_APPS →
  2.  在 admin.py 用 @admin.register 注册模型 + 定制显示 → 
  3. 启动服务器,登录后台 →
  4. 愉快地增删改查!

整个过程就像:给你的模型办一张 “后台 VIP 卡” ,让它能在 Django Admin 里被可视化管理🎉

http://www.dtcms.com/a/311254.html

相关文章:

  • 大模型复杂任务
  • 【MySQL】增删改查操作 —— CRUD
  • 楼市低迷能否通过股市提振
  • ADB 底层原理
  • Android 15 中禁用/启用应用的系统级方法
  • 二叉搜索树(C++实现)
  • LeetCode 刷题【26. 删除有序数组中的重复项、27. 移除元素、28. 找出字符串中第一个匹配项的下标】
  • 10.1通用数据类型
  • 查找文献
  • 类似 Pixso 但更侧重「网页 / 软件界面设计」「前后端可视化开发」的工具
  • 【智能体cooragent】_process_workflow 结构拆解分析
  • 一维dp-序列类型-最长有效括号
  • XGBoost三部曲:XGBoost参数详解
  • 机械臂的轨迹生成的多种方案
  • 信号完整性、电源完整性与电磁兼容的含义
  • Removing Digits(Dynamic Programming)
  • SEA-RAFT:更简单、更高效、更准确的RAFT架构
  • 人工智能与交通:智能出行的变革与未来
  • OneCode 3.0表达式从语法到执行的全链路设计
  • 解锁智能油脂润滑系统:加速度与温振传感器选型协同攻略
  • 【隧道篇 / IPsec】(7.6) ❀ 02. 如何删除向导创建的IPsec安全隧道 (点对点) ❀ FortiGate 防火墙
  • 阿里云:Ubuntu系统部署宝塔
  • 【Go语言-Day 29】从time.Now()到Ticker:Go语言time包实战指南
  • eSIM技术深度解析:从物理芯片到数字革命
  • SAP 标准代码测试OO ALV案例分享
  • ubuntu22.04离线一键安装gpu版docker
  • Unity —— Android 应用构建与发布​
  • 社群团购市场选择与开源技术赋能下的下沉市场开拓策略研究——以开源AI智能名片、链动2+1模式与S2B2C商城小程序为例
  • 苹果MAC 安卓模拟器
  • 2561. 重排水果