ORM
- ORM全拼 Object-Relation Mapping, 對象-關係映射,主要實現模型對象到關係數據庫數據的映射()
ORM圖解
# 調用模型類對象的Save()生成 insert、update語句
# 調用模型類對象的Delete()生成delete語句
# 調用模型類的all()、get()生成select語句
#優點
* 只需要面向對象編程,不需要面向數據庫編寫代碼
- 對數據庫的操作都轉化成類屬性和方法的操作
- 不用編寫各種數據庫的sql語句
* 實現了數據模型與數據庫的解耦,屏蔽了不同數據庫操作上的差異
- 不在關注用的是myspl、oracle...等
- 通過簡單的配置就可以輕鬆更換數據庫,而不需要修該代碼
# 缺點
* 相比較直接使用SQL語句操作數據庫,有性能損失
* 根據對象的操作轉換成SQL語句,根據查詢的結果轉化成對象,在映射過程中有性能損失
* 都不寫SQL語句了
mysql數據庫配置
pip install pymysql
DATABASES={
'default':{
'ENGINE': 'django.db.backends.mysql',
'NAME': 'Bookdb',
'HOST': '192.168.80.132',
'PORT': '3306',
'USER': 'root',
'PASSWORD': 'mysql',
}
}
control+d
字段類型
- 總結語法:屬性名 = modles.字段類型(選項)
- 定義屬性時需要指定字段類型,通過字段類型的參數指定選項
- 不允許使用python的保留關鍵字
- 不允許使用mysql的保留關鍵字
- 不允許使用連續的下劃線,因爲Django的查詢語法就是連續的下劃線
- 當前選擇的數據庫支持字段的類型
- 渲染管理表單時使用的默認html控件
- 在管理站點最低限度的驗證
- 使用時需要引入from django.db import models包
AutoField:自動增長的IntegerField,通常不用指定
BooleanField:布爾字段,值爲True或False
NullBooleanField:支持Null、True、False三種值
CharField(max_length=字符長度): 字符串
TextFiled:大文本字段,一般超過4000個字符時使用
IntegeField: 整數
DecimalField(max_digits=None,decimal_places=None):可以指定精度的十進制浮點數
FloatField: 浮點數
DateField[auto_now=False,auto_now_add=False]:日期
TimeField:時間,參數同DateField
DateTimeField:日期時間,參數同DateField
FileField:上傳文件字段
ImageField:繼承於FileField,對上傳的內容進行校驗,確保是有效的圖片
null:如果爲True,表示允許爲空,默認值是False(針對數據庫表裏的字段的約束)
blank:如果爲True,則該字段允許爲空白,默認值是False(針對後臺站點的表單的約束)
db_column:字段的名稱,如果未指定,則使用屬性的名稱
db_index:若值爲True, 則在表中會爲此字段創建索引,默認值是False
default:默認值
primary_key:若爲True,則該字段會成爲模型的主鍵字段,默認值是False,一般作爲AutoField的選項使用
unique:如果爲True, 這個字段在表中必須有唯一值,默認值是False
ForeignKey:一對多,將字段定義在多的一端中
ManyToManField:多對多,將字段定義在任意一端中
OneToOneField:一對一,將字段定義在任意一端中
維護遞歸的關聯關係,使用self指定
- 作用:修改數據庫表的默認的名稱
- 修改、創建表就要遷移
class Meta:
db_table = 'bookinfo'
模型成員
# 模型實例方法
str:在將對象轉換成字符串時會被調用
save:將模型對象保存到數據庫表中
delete:將模型對象從數據庫表中刪除
# objects模型屬性
- objects: 管理器對象
- 是Manager類型的對象
- 用於模型對象和數據庫交互
- 默認自動生成的屬性,但是可以自定義管理器對象
- 自定義管理器對象後,Django不再可以自定義管理器對象objects
# 管理器類Manager
- 定義在from django.db import models中
- 管理器是Django的模型進行數據庫操作的接口,Django應用的每個模型都擁有至少一個管理器
- Django模型支持自定義管理器類,繼承自models.Manager
## 自定義管理器主要2中情況
1.修改原始查詢集,重寫get_queryset()方法
- 查詢時,如果需要默認過慮掉某些數據,需要修改原始查詢集
2.新增管理器方法,如創建模型對象方法.
- 當模型屬性很多,多數字段默認值,每次只需要給少數屬性賦值時,可以新增模型初始化方法
* 注意:不能重寫init方法做初始化操作;因爲Model本身會在init方法中做默認的初始化操作,如果重寫該方法會跟Model默認的衝突
查詢操作
# 特點
1.惰性執行:創建查詢集不會訪問數據庫,直到在模板中調用數據時,纔會訪問數據庫
- 調用數據的情況包括迭代、序列化、與if合用
2.緩存:查詢集的結果被存下來之後,再次查詢相同數據時會使用之前緩存的數據
# 返回列表的過濾器
all():返回所有的數據
filter():返回滿足條件的數據
exclude():返回滿足條件之外的數據,相當於sql語句中where部分的not關鍵字
order_by:返回排序後的數據
# 返回單個對象的過濾器
get():返回單個滿足條件的對象
count():返回當前查詢的總條數
aggregate():聚合
exists():判斷查詢集中是否有數據,如果有則返回True,沒有則返回False
- 限制查詢集
- 查詢集返回列表,可以使用下標的方式進行限制,等同於sql中的limit和offset子句
- 注意:不支持負數索引
- 使用下標後返回一個新的查詢集,不會立即執行查詢
基礎條件查詢
- 語法:filter(模型屬性__條件運算符=值)
- 提示:exact(判斷相等可以不寫直接id=1,id等價於PK)、contains(表示包含,類似like)、starswith(以什麼開頭)、endswith(以什麼結尾)、isnull(是否爲空)、in(表示只能在指定的選項中,不表示區間)、gt:大於lt:小於gte:大於等於 lte:小於等於,運算符都區分大小寫,在其前加i表示不區分大小寫
F和Q對象
from django.db.models import F
F('屬性名')
from django.db.models import Q
Q(模型屬性1_條件運算符=值) | Q(模型屬性2_條件運算符=值)
~Q(模型屬性_條件運算符=值)
聚合函數
- 使用aggregate()過濾器調用聚合函數,返回單個對象
# 聚合函數包括:Avg, Max, Min, Sum, Count(使用Count一般直接調用)
關聯查詢
# 基礎關聯查詢
- 一查多:會把多的那個模型類名全部轉成小寫,再拼接_set
# 內連接查詢語法
filter(關聯模型類名小寫_屬性名_運算符=值)
- 多查一,關聯的模型類名小寫需要使用外鍵
# 自關聯查詢
自關聯的表結構:對於地區信息、分類信息等數據,表結構非常類似,每個表的數據量十分有限,爲了充分利用數據表的大量數據存儲功能,可以可以設計成一張表,內部的關係字段指向本表的主鍵
說明:關係屬性使用self指向本類,要求null和blank允許爲空,因爲一級數據是沒有父級的