1. 程式人生 > >Django的基本使用(二)

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"))