Model 模型 創建數據庫表
- 數據操作封裝
- 定義數據表結構
- 模型類、表、屬性、字段
- 定義模型
- 繼承自Model
- class Meta 源信息
- db_table 表名
- 定義字段
- 字段類型:CharField、TextField、IntegerField、FloatField、BooleanField、DecimalField、NullBooleanField、AutoField、FailField、ImageField
- 字段y約束:max_length、default、unique、index、primary_key、db_column
- 繼承自Model
- 映射到庫中:生成遷移文件、執行遷移
- 前提:數據庫配置完畢
- 默認配置的SQLite
- 自主配置MySQL:引擎、數據庫名、用戶名、密碼、主機、端口、驅動(需要僞裝)
- 前提:數據庫配置完畢
- ORM(Object Relational Mapping) 對象關係映射
- 將業務邏輯和SQL語句進行了解耦--核心思想解耦合
- 可以理解爲翻譯機
- CRUD
- CREATE save 創建對象
- 直接實例化對象,設置屬性
- 創建對象,傳入屬性
- 使用Model.Objects.create()
- 自己封裝類方法創建
- 在Manager中封裝方法創建
- 更新:基於查詢 save
- 刪除:基於查詢 delete
- 查詢:查詢句柄 objects
- 隱性屬性
- Manager實例
- 操作都封裝在這裏面 獲取查詢結果集 QuerySet
- all、filter、exclude、order_by、values
- 切片:不支持負數;實際上相當於Limit offset
- 懶查詢:觀察者模式、發佈者訂閱者模式、廣播
- 獲取單個對象
- get (1)不存在會拋異常DoesNotExist (2)存在多於一個MultipleObjectsReturned (3)使用這個函數記得捕獲異常
- last
- first:(1)坑點 (2)可能出現第一個和最後一個是一樣的 (3)需要主動進行排序
- 條件 屬性__操作符=臨界值 gt、gte、lt、lte、in、exact、startswith、endswith、contains、ignore(iexact、icontains、istartswith、iendswith)
- 條件升級
- F:獲取字段信息、通常用在模型的自我屬性比較、支持算數運算
- Q:條件封裝、支持邏輯運算(& | ~)
- 內置函數:count、exists
- 聚合函數:操作列、Max、Avg、Min、Sum、Count
- CREATE save 創建對象
- 屬性
- 顯性屬性:開發者手動聲明的屬性
- 隱性屬性:沒有聲明,父類中也不存在,動態產生出來的;如果開發者主動聲明瞭這些屬性,隱性屬性自己就不再生成了
- 重要數據處理
- 邏輯字段
- is_delete
- 自定義Manager實現統一封裝--重寫get_queryset
- 數據庫中數據類型
- 字符串
- 數字
- 日期時間
- 方法
- 對象方法
- 可以調用對象的屬性,也可以調用類的屬性
- 類方法
- 不能調用對象屬性,只能調用類屬性
- 靜態方法
- 不能調用,不能獲取對象屬性,也不能獲取類屬性
- 只是寄生在我們這個類而已
- 對象方法
- 狀態碼
- 2XX
- 請求成功
- 3XX
- 轉發或重定向
- 4XX
- 客戶端錯誤
- 5XX
- 服務器錯誤
- 後端開發人員最不想看到的
- 2XX
- 獲取單個對象
- 查詢條件沒有匹配的對象,會拋出異常,DoesNotExist
- 如果查詢條件對應多個對象,會拋出異常,MultipleObjectsReturned
- First和Last
- 默認情況下可以正常從QuerySet中獲取
- 隱藏Bug
- 可能會出現first和last獲取到的是相同的對象
- 顯式,手動寫排序規則
- 可能會出現first和last獲取到的是相同的對象
- 切片
- 和Python中的切片不同
- QuerySet[5:15] 獲取的是第5條到第15條數據
- 相當於SQL中 limit 和 offset
- 緩存集
- filter——過濾符合條件的數據
- exclude——過濾除了條件之外的數據
- 連續使用
- 鏈式調用
- Person.objects.filter().filter().xxxx.exclude().exclude().yyyy
- all
- 都不會真正的去查詢數據庫
- 只有我們在迭代結果集,或者獲取單個對象屬性的時候,它纔會去查詢數據庫
- 懶查詢
- 爲了優化我們結構和查詢
- 查詢條件
- 屬性_運算符=值
- gt
- lt
- gte
- lte
- in 在某一集合中
- contains 類似於 模糊查詢 like
- startswith 以xx開始 本質也是like
- endswith 以xx結束 也是like
- exact
- 前面同時添加,ignore忽略
- iexact
- icontains
- istartswith
- iendswith
- django中查詢條件有時區問題
- 關閉django中自定義的時區
- 在數據庫中創建對應的時區表
- settings.py中,
USE_TZ = True,如果改爲False,則關閉時區
- 聚合函數
- 使用aggregate()函數返回聚合函數的值
- Avg:平均值
- Count:數量
- Max:最大
- Min:最小
- Sum:求和
- 例如:Student.objects().aggregate(Max('sage'))
- F對象
- 可以獲取我們的屬性值,可以使用模型的A屬性與B屬性進行比較
- 例:grades = Grade.objects.filter(ggirlnum__gt=F('gboynum'))
- 可以實現一個模型的不同屬性的運算操作
- 可以支持算數運算
- 例:grades = Grade.objects.filter(ggirlnum__gt=F('gboynum') + 10)
- 可以獲取我們的屬性值,可以使用模型的A屬性與B屬性進行比較
- Q對象
- 可以對條件進行封裝,過濾器方法中的關鍵參數,常用於組合條件
- 例:Student.objects.filter(Q(sage__lt=25)) #年齡小於25
- Student.objects.filter(~Q(sage__lt=25)) #年齡大於等於25
- 封裝之後,可以支持邏輯運算
- 與 & and
- 或 | or
- 非 ~ not
- 可以對條件進行封裝,過濾器方法中的關鍵參數,常用於組合條件
- 模型成員
- 顯性屬性
- 開發者手動書寫的屬性
- 隱性屬性
- 開發者沒有書寫,ORM自動生成的屬性
- 如果將隱性屬性手動聲明,系統就不會產生隱性屬性
- 顯性屬性
- 模型管理器類
- 模型管理器是Django的模型與數據庫進行交互的接口,一個模型可以有多個模型管理器
- 作用
- 可以向管理器中添加額外的方法
- 修改管理器返回的原始查詢集
- 提供創建對象的方式
- 例如:
from django.db import models class AnimalManager(models.Model): def get_queryset(self): return super(AnimalManage, self).get_queryset().filter(is_delete=False) def create(self, a_name='Chicken'): a = self.model() a.a_name = a_name return a class Animal(models.Model): a_name = models.CharField(max_length=16) is_delete = models.BoolenField(default=False) a_m = AnimalManager()
models.py中級聯
class Grade(models.Model):
g_name = models.CharField(max_length=16)
class Student(models.Model):
s_name = models.CharField(max_length=16)
s_grade = models.ForeignKey(Grade, on_delete=models.CASCADE) #需要添加on_delete=models.CASCADE 級聯
快捷鍵記錄:
多用點可以加快編寫代碼的速度
.re—— 快捷生成return
.if