Django_模型

ORM

  • ORM全拼 Object-Relation Mapping, 對象-關係映射,主要實現模型對象到關係數據庫數據的映射()
ORM圖解
# 調用模型類對象的Save()生成 insertupdate語句
# 調用模型類對象的Delete()生成delete語句
# 調用模型類的all()、get()生成select語句 
#優點 
* 只需要面向對象編程,不需要面向數據庫編寫代碼
            - 對數據庫的操作都轉化成類屬性和方法的操作
            - 不用編寫各種數據庫的sql語句
* 實現了數據模型與數據庫的解耦,屏蔽了不同數據庫操作上的差異
        - 不在關注用的是myspl、oracle...等
        - 通過簡單的配置就可以輕鬆更換數據庫,而不需要修該代碼
# 缺點
* 相比較直接使用SQL語句操作數據庫,有性能損失
* 根據對象的操作轉換成SQL語句,根據查詢的結果轉化成對象,在映射過程中有性能損失
* 都不寫SQL語句了

mysql數據庫配置

pip install pymysql

# 配置mysql數據庫
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的查詢語法就是連續的下劃線
# 字段類型
##提示:Django根據屬性的類型確定以下信息
- 當前選擇的數據庫支持字段的類型
- 渲染管理表單時使用的默認html控件
- 在管理站點最低限度的驗證
- 使用時需要引入from django.db import models包

AutoField:自動增長的IntegerField,通常不用指定
BooleanField:布爾字段,值爲TrueFalse
NullBooleanField:支持Null、TrueFalse三種值
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對象

# F對象語法
from django.db.models import F
F('屬性名')

# Q對象語法
from django.db.models import Q
# 邏輯或
Q(模型屬性1_條件運算符=值) | Q(模型屬性2_條件運算符=值)
# 邏輯非
~Q(模型屬性_條件運算符=值)

聚合函數

  • 使用aggregate()過濾器調用聚合函數,返回單個對象

# 聚合函數包括:Avg, Max, Min, Sum, Count(使用Count一般直接調用)

關聯查詢

# 基礎關聯查詢
 - 一查多:會把多的那個模型類名全部轉成小寫,再拼接_set
# 內連接查詢語法
filter(關聯模型類名小寫_屬性名_運算符=值)
 - 多查一,關聯的模型類名小寫需要使用外鍵

# 自關聯查詢
自關聯的表結構:對於地區信息、分類信息等數據,表結構非常類似,每個表的數據量十分有限,爲了充分利用數據表的大量數據存儲功能,可以可以設計成一張表,內部的關係字段指向本表的主鍵
說明:關係屬性使用self指向本類,要求null和blank允許爲空,因爲一級數據是沒有父級的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章