一、關于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 里被可視化管理🎉