Django的基本使用(二)
M — model 資料模型層 作用:方便的操作資料庫
一、連線資料庫
mysql, sqlserver, oracle…..
0.django預設只能連線關係型資料庫
1.安裝依賴的庫
可以使用的庫: (1)pymysql (2)python_mysql(不穩定) (3)mysqlclient(配置麻煩)
安裝pymsql: pip install pymysql
如果出現 timeout 超時可以使用其他的資源下載:
pip install 模組名 -i https://pypi.douban.com/simple
2. 匯入庫
在 __init__
# 匯入pymysql模組
import pymysql
pymysql.install_as_MySQLdb()
3.在setting的database中配置mysql的連線
'ENGINE': 'django.db.backends.mysql', # 設定驅動
'NAME':"week01", # 設定資料庫名
'USER':'root', # 設定使用者名稱
'PASSWORD':'123', # 設定密碼
'HOST':'localhost', # 設定主機地址
'PORT':3306, # 設定埠號
4.注意:不要忘記了在資料庫中建立該庫
create database 資料庫名 charset='utf8';
5.連線mysql資料庫
(1)點選右側database (2)選擇data source,選擇資料庫型別(如:mysql) (3)設定賬號, 密碼, 主機 (注意: 如果對mysql設定遠端連線, 需要使用遠端連線的賬號密碼) (4)測試,點選test connect,出現successful即可
6.測試程式能否能連
(1)執行遷移
python manage.py makemigrations
python manage.py migrate
(2)看到自動生成的表即可
二、orm 物件關係隱射
思想: 相當於一個翻譯機 object relational mapping
1.開發人員不要寫複雜的sql語句,直接呼叫對應的方法即可
2.開發人員不需要封裝查詢結果,查詢結果直接就是物件,可以直接使用
3.如果開發人員需要跟換資料庫, 不需要更改任何的程式碼,直接修改資料庫的連線即可
三、建立一個表
1.需要在model模組中建立一個類,注意該類必須繼承 models.Model
注意: 表名預設是 應用名_類名
2.定義屬性名 — 屬性需要與表中欄位對應 欄位名即屬性名 欄位的資料型別 欄位的約束型別 詳細:見定義屬性文件
3. 案例:
# 定義模型
# 注意: 執行遷移後,才會在資料庫自動建立對應的表
# 預設的表名為: 應用名_類名 類名會自動轉換成全小寫
# 可以使用(內部類):
class Meta:
db_table = "表名" # 修改表名
# 預設的欄位名 就是 定義的屬性名, 可以使用 db_column = "欄位名" 來修改欄位名
# 預設會自動建立主鍵id,如果使用AutoField則不會自動建立
class Person(models.Model):
p_name = models.CharField(max_length=20,null=False,unique=True)
p_age = models.IntegerField(default=10)
p_sex = models.BooleanField(default=True)
# ....
# 表的結構是可以修改的,修改後,需要重新的遷移才能生效,最好不要修改
# 注: 會自動的檢測那些屬性進行了修改
四、增加一個數據
1.建立一個物件
2.設定屬性
3.儲存資料
物件名.save()
五、刪除資料
MySQL中刪除資料的命令:delete from 表名 whree 條件
0.要刪除資料,前提條件是先查詢到對應的資料
1.刪除:
# 可以直接刪除多個結果,也可以直接刪除一個
查詢結果.delete()
六、修改資料
MySQL中修改資料的命令:update 表名 set 欄位名=資料,... where 條件
0.要修改資料,前提條件也是先查詢到對應的資料
1.修改
物件名.屬性名 = 值
物件名.save()
七、查詢資料
1.查詢方法
格式: 類名.objects.方法
— 支援鏈式呼叫
(1)查詢多條結果
all()
獲取所有的結果
filter(條件)
按照條件篩選資料
exclude(條件)
篩選出滿足條件以外的資料
(2)查詢單個結果
first()
獲取結果集的第一個
last()
獲取結果集的最後一個
get()
獲取一個結果, 注意: 有且只有一個結果的時候使用get()
才可以, 如果結果超過一個或者沒有, 程式都出錯
(3)其他
count()
獲取結果集的數量
order_by("-屬性名")
表示按照屬性名對應的值排序, 預設是升序, -屬性名
表示降序排序。如果是字元型別的資料, 是按照字元對應的碼錶來排序的, 一個字元一個字元的的比較, 如: “aac” “abc”比較 , 則”aac”小,
exists()
判斷查詢結果集中是否有資料
values()
獲取結果集的資料,該資料是類似字典的形式,方便操作
2.條件中的運算子
格式: 屬性名__運算子=值
注意:是2個下劃線
運算子:
gt 大於
gte 大於等於
lt 小於
lte 小於等於
= 等於 或者 exact
不等於 exclude(條件)
isNull 為空的資料
startwith 查詢以某個字元開始
endwith 查詢以某個字元結尾的
contain 查詢包含某個字元的
istartwith i 是ignore的簡寫, 忽略大小寫查詢
iendwith
icontain
in 成員運算子, 是否是集合中值的其中一個,滿足一個就符合條件
特殊用法** pk=值 pk是主健的簡寫
3.Q與F物件
(1)Q物件, 用來幫助實現 邏輯運算子
& 且 如: ...filter(Q(p_age__gt=90) & Q(p_age__lt=95)) # 注意導包
| 或 如: ...filter(Q(p_name="三胖胖40") | Q(p_name="三胖胖61"))
~ 非 如: ...filter(~Q(p_age__lte=100))
(2)F 物件, 用來幫助自己的屬性與自己的屬性比較 如:
# 需求:實現年齡比id小的資料
persons = Person.objects.filter(p_age__lt=F("id"))
4.查詢結果的切片
格式: 結果集[start:stop]
包前不包後 擷取從start位置到stop位置的資料
5.聚合函式的使用
Max
Min
Avg
Sum
注意: (1)大小寫 (2)注意導包 如:
# 求年齡最大的
res = Person.objects.all().aggregate(Max("p_age"))
# 求年齡最大的
res = Person.objects.all().aggregate(Min("p_age"))