Python Django Model 模型

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
  • 映射到庫中:生成遷移文件、執行遷移
    • 前提:數據庫配置完畢
      • 默認配置的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
  • 屬性
    • 顯性屬性:開發者手動聲明的屬性
    • 隱性屬性:沒有聲明,父類中也不存在,動態產生出來的;如果開發者主動聲明瞭這些屬性,隱性屬性自己就不再生成了
  • 重要數據處理
    • 邏輯字段
    • is_delete
    • 自定義Manager實現統一封裝--重寫get_queryset
  • 數據庫中數據類型
    • 字符串
    • 數字
    • 日期時間
  • 方法
    • 對象方法
      • 可以調用對象的屬性,也可以調用類的屬性
    • 類方法
      • 不能調用對象屬性,只能調用類屬性
    • 靜態方法
      • 不能調用,不能獲取對象屬性,也不能獲取類屬性
      • 只是寄生在我們這個類而已
  • 狀態碼
    • 2XX
      • 請求成功
    • 3XX
      • 轉發或重定向
    • 4XX
      • 客戶端錯誤
    • 5XX
      • 服務器錯誤
      • 後端開發人員最不想看到的
  • 獲取單個對象
    • 查詢條件沒有匹配的對象,會拋出異常,DoesNotExist
    • 如果查詢條件對應多個對象,會拋出異常,MultipleObjectsReturned
  • First和Last
    • 默認情況下可以正常從QuerySet中獲取
    • 隱藏Bug
      • 可能會出現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)
  • 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章