# Models 模型
- ORM
- ObjectRelationMap : 把面向對象思想轉換成關係數據庫思想.操做上把類等價於表格
- 類對應表格
- 類中的屬性對應表中的字段
- 在應用中的models.py文件中定義class
- 全部須要使用ORM的class都必須是 models.Model 的子類
- class中的全部屬性對應表格中的字段
- 字段的類型都必須使用 modles.xxx 不能使用python中的類型
- 在django種,Models負責跟數據庫交互python
- django連接數據庫
- 自帶默認數據庫Sqllite3
- 關係型數據庫
- 輕量級
- 建議開發用sqlite3, 部署用mysql之類數據庫
- 切換數據庫在settings中進行設置
# django 鏈接 mysql
DATABASES = [
'default' = {
'ENGINE' : 'django.db.backends.mysql',
'NAME' : '數據庫名',
'PASSWORD': '數據庫密碼',
'HOST': '127.0.0.1',
'PORT': '3306',
}
]
- 須要在項目文件下的__init__文件中導入pymysql包
```
# 在主項目的__init__文件中mysql
import pymysql
pymysql.install_as_MySQLdb()
```
# models類的使用
- 定義和數據庫表映射的類
- 在應用中的models.py文件中定義class
- 全部須要使用ORM的class都必須是 models.Model 的子類
- class中的全部屬性對應表格中的字段
- 字段的類型都必須使用 modles.xxx 不能使用python中的類型
- 字段經常使用參數
1. max_length : 規定數值的最大長度
2. blank : 是否容許字段爲空,默認不容許
3. null : 在DB中控制是否保存爲null, 默認爲false
4. default : 默認值
5. unique : 惟一
6. verbose_name : 假名sql
- 數據庫的遷移
1. 在命令行中,生成數據遷移的語句(生成sql語句)shell
```
python3 manage.py makemigrations
```
2. 在命令行中,輸入數據遷移的指令數據庫
```
python3 manage.py migrate
```django
ps : 若是遷移中出現沒有變化或者報錯,能夠嘗試強制遷移app
```
# 強制遷移命令
python3 manage.py makemigrations 應用名
python3 manage.py migrate 應用名
```
3. 對於默認數據庫, 爲了不出現混亂,若是數據庫中沒有數據,每次遷移前能夠把系統
自帶的sqlite3數據庫刪除
# 1. 查看數據庫中的數據函數
```
1. 啓動命令行 : python3 manage.py shell
ps: 注意點: 對orm的操做分爲靜態函數和非靜態函數兩種.靜態是指在內存中只有一分內容存在,調用的時候使用 類名. 的方式.若是修改了那麼全部使用的人都會受影響.
2. 在命令行中導入對應的映射類
from 應用.models import 類名
3. 使用 objects 屬性操做數據庫. objects 是 模型中實際和數據庫進行交互的 Manager 類的實例化對象.
4. 查詢命令
- 類名.objects.all() 查詢數據庫表中的全部內容. 返回的結果是一個QuerySet類型,其實是類列表中裝這個一個一個數據對象.
- 類名.objects.filter(條件)
```spa
```
# from 應用名.models import 類名
from myapp.models import Student命令行
# 查詢Student表中的全部數據,獲得的是一個QuerySet類型
Student.objects.all()
# 若是要取出全部QuerySet類型中的全部數據對象,須要遍歷取出全部的對象,再用對象.屬性來查看值
s = Student.object.all()
for each in s:
print(each.name , each.age , each.address , each.phone)
# 若是要進行過濾篩選,使用filter()方法
Student.objects.filter(age=18)
```
# 2. 添加數據
```
對象 = 類() # 使用類實例化對象
對象.屬性 = 值 # 給對應的對象的屬性賦值
對象.save() # 必需要執行保存操做,不然數據沒有進入數據庫
```
python3 manage.py shell 命令行中添加數據
```
# from 應用名.models import 類名
from myapp.models import Student
# 實例化對象
s = Student()
# 給對象的屬性賦值
s.name = '張三'
s.address = '雲南昭通'
s.phone = '13377886678'
s.age = 20
# 保存數據
s.save()
```
- 常見查找方法
1. 通用查找格式: 屬性名 _ _ (用下面的內容) =值
- gt : 大於
- gte : 大於等於
- lt : 小於
- lte : 小於等於
- range: 範圍
- year : 年份
- isnull : 是否爲空
2. 查找等於指定值的格式: 屬性名 = 值
3. 模糊查找: 屬性名 _ _ (使用下面的內容) = 值
* exact : 精確等於
* iexact: 不區分大小寫
* contains: 包含
* startwith: 以..開頭
* endwith: 以…結尾
# 數據庫表關係
- 多表聯查:利用多個表聯合查找某一項信息或者多項信息
- 1:1 OneToOne
- 創建關係:在模型任意一邊便可,使用OneToOneField
- add:
- 添加沒有關係的一邊,直接實例化保存就能夠
>>> s = School()
>>> s.school_id = 2
>>> s.school_name = "nanjingtulingxueyuan"
>>> s.save()
- 添加有關係的一邊,使用create方法,或者使用實例化而後save
# 方法1
>>> m = Manager()
>>> m.manager_id = 10
>>> m.manager_name = "dana"
>>> m.my_school = s
>>> m.save()
# 方法2
>>> m = Manager.objects.create(manager_id=20, manager_name="erna", my_school=ss[0])
- query:
- 有子表查母表: 由子表的屬性直接提取信息
- 由母表查子表:使用雙下劃線
>>> s = School.objects.get(manager__manager_name="dana")
>>> s
<School: nanjingtulingxueyuan>
- change:
- 單個修改使用save
- 批量修改使用update
- 不管對子表仍是對母表的修改
- delete: 直接使用delete仍是刪除
- 1:N OneToMany
- 一個表格的一個數據項/對象等,能夠有不少個另外一個表格的數據項
- 好比:一個學校能夠有不少個老師,但一個老師只能在一個學校裏上班
- 使用上
- 使用ForengnKey
- 在多的那一邊,好比上邊的例子就是在Teacher的表格裏進行定義
Add:
- 跟一對一方法相似,經過create和new來添加
- create: 把屬性都填滿,而後不須要手動保存
- new: 能夠屬性或者參數爲空,必須用save保存
Query:
- 以學校和老師的例子爲準
- 若是知道老師,查學校 ,則經過增長的關係屬性,直接使用
- 例如,查找t1老師是哪一個學校的
- 反查=
- 有學校,我想查下這個學校全部老師,則系統自動在老師模型名稱的小寫下直接加下劃線set,
用來表示
- N:N ManyToMany
- 表示任意一個表的數據能夠擁有對方表格多項數據,反之亦然
- 好比典型例子就是老師和學生的關係
- 使用上,在任意一方,使用ManyToMany定義,只須要定義一邊
- Add:
- 添加老師,則在student.teachers.add()
- Query:
- 跟一對多相似,使用_set查詢