Django模型
一、ORM映射轉換:????????
第一層意思:映射
Object????????????????對象????????????????--????????models文件中定義的模型類對象
Relation??????????????????????關系????????????????--????????關系數據庫中的數據表
Mapping?????????????映射????????????????--????????對象和數據表的一一對應
實例對象????????????????????????--????????一條完整數據記錄
?
模型類????????????????????????????????數據庫表
類名????????????????????????????????表名
屬性????????????????????????????????字段
字段類型????????????????????????字段屬性
?
第二層意思:轉換
?
模型類做的一個動作????????????????????????????????具體的sql語句
all()????????????????????????????????????????????????select* from …
在MVC框架中的Model模塊中都包括ORM,對于開發人員主要帶來了如下好處:
實現了數據模型與數據庫的解耦,通過簡單的配置就可以輕松更換數據庫,而不需要修改代碼
只需要面向對象編程,不需要面向數據庫編寫代碼
在MVC中Model中定義的類,通過ORM與關系型數據庫中的表對應,對象的屬性體現對象間的關系,這種關系也被映射到數據表中,Django框架中ORM示意圖如下
?
二、自定義模型:
?
定義屬性
- 默認創建的主鍵列屬性為id,可以使用pk代替,pk全拼為primary key
- 屬性命名限制
- 不能是python的保留關鍵字
- 不允許使用連續的下劃線,這是由django的查詢方式決定的定義屬性時需要指定字段類型,通過字段類型的參數指定選項,語法如下:
屬性=models.字段類型(選項)
?
?
字段類型
- BooleanField:布爾字段,值為True或False
- CharField(max_length=字符長度):字符串
- 參數max_length表示最大字符個數
- IntegerField:整數
- DateField[auto_now=False, auto_now_add=False]):日期
?
選項
- null:如果為True,表示允許為空,默認值是False
- blank:如果為True,則該字段允許為空白,默認值是False
- 對比:null是數據庫范疇的概念,blank是表單驗證證范疇的
- default:默認值
?
關系字段類型
- ForeignKey:一對多,將字段定義在多的一端中
- ManyToManyField:多對多,將字段定義在兩端中
- OneToOneField:一對一,將字段定義在任意一端中
?
- 由一到多的訪問語法:
對象.模型類小寫_set
例:bookinfo.heroinfo_set
- 由一到一的訪問語法
對象.模型類小寫
例:heroinfo.bookinfo
- 訪問關聯對象的id語法
對象.屬性_id
例:heroinfo.book_id
?
元選項
- 數據表的默認名稱為
<app_name>_<model_name>
例:booktest_bookinfo
- 在模型類中定義類Meta,用于設置元信息,如使用db_table自定義表的名字
?
三、模型成員
?
模型實例方法
- str:在將對象轉換成字符串時會被調用
- save():將模型對象保存到數據表中
- delete():將模型對象從數據表中刪除
?
?
管理器:
默認管理器:
默認的名稱是objects
可以改名,以覆蓋的形式:books= models.Manager()
注意:二者只能生存一個
?
自定義的管理器: books = BookInfoManager()
1、修改原始查詢集,重寫get_queryset()方法,更改(重寫)某個特殊類型屬性
2、向管理器類中添加額外的方法,如創建對象,增加一個特殊的屬性
注意:自定義的管理器可以和默認管理器同時存在
?
?
四、查詢集
?
- 兩大特性
- 惰性執行:創建查詢集不會訪問數據庫,直到調用數據時,才會訪問數據庫,調用數據的情況包括迭代、序列化、與if合用
- 緩存:查詢集的結果被存下來之后,再次查詢時會使用之前緩存的數據
?
返回列表的過濾器如下:
- all():返回所有數據
- filter():返回滿足條件的數據
- exclude():返回滿足條件之外的數據,相當于sql語句中where部分的not關鍵字
- order_by():排序
?
返回單個值的過濾器如下:
- get():返回單個滿足條件的對象
- count():返回當前查詢的總條數
- aggregate():聚合
- exists():判斷查詢集中是否有數據
?
限制查詢集
- 查詢集返回列表,可以使用下標的方式進行限制
- 示例:list=BookInfo.books.all()[0:2]
?
?
字段查詢
- 語法如下:
- 說明:屬性名稱和比較運算符間使用兩個下劃線,所以屬性名不能包括多個下劃線,屬性名稱__比較運算符=值
?
條件運算符
- exact:表示判等
- contains:是否包含
- startswith、endswith:以指定值開頭或結尾
- isnull:是否為null
- 以上運算符都區分大小寫,在這些運算符前加上i表示不區分大小寫,如iexact、icontains、istartswith、iendswith
- in:是否包含在范圍內
- gt、gte、lt、lte:大于、大于等于、小于、小于等于
- 不等于使用等于的運算符,使用exclude()過濾器
- year、month、day、week_day、hour、minute、second:對日期時間類型的屬性進行運算
?
關聯查詢
- 語法如下:
關聯模型類名小寫__屬性名__運算符=值
- 如果沒有沒有“__運算符”部分,表示等于,結果和sql中的inner join相同
- 例:查詢圖書,要求圖書中英雄的描述包含‘八’
list =BookInfo.books.filter(heroinfo__hcontent__contains='八')
?
- 例:查詢書名為“天龍八部”的所有英雄
list =HeroInfo.objects.filter(hbook__btitle='天龍八部')
?
F對象
- 之前的查詢都是對象的屬性與常量值比較,兩個屬性怎么比較呢? 答:使用F對象,被定義在django.db.models中
- 語法如下:F(屬性名)
- 例:查詢閱讀量大于等于評論量的圖書
from django.db.models importF
...
list = BookInfo.books.filter(bread__gte=F('bcommet'))
?
- 可以在F()對象上使用算數運算
- 例:查詢閱讀量大于2倍評論量的圖書
list =BookInfo.books.filter(bread__gt=F('bcommet') * 2)
?
?
Q對象
- 多個過濾器逐個調用表示邏輯與關系,同sql語句中where部分的and關鍵字
- 例:查詢閱讀量大于20,并且編號小于3的圖書
list=BookInfo.books.filter(bread__gt=20,id__lt=3)
或
list=BookInfo.books.filter(bread__gt=20).filter(id__lt=3)
?
- 如果需要實現邏輯或or的查詢,需要使用Q()對象結合|運算符
- Q對象被義在django.db.models中
- 語法如下:Q(屬性名__運算符=值)
- 例:查詢閱讀量大于20的圖書,改寫為Q對象如下
from django.db.models importQ
...
list = BookInfo.books.filter(Q(bread__gt=20))
?
- Q對象可以使用&、|連接,&表示邏輯與,|表示邏輯或
- 例:查詢閱讀量大于20,或編號小于3的圖書,只能使用Q對象實現
list =BookInfo.books.filter(Q(bread__gt=20) | Q(pk__lt=3))
?
?
- Q對象前可以使用~操作符,表示非not
- 例:查詢編號不等于3的圖書
list =BookInfo.books.filter(~Q(pk=3))
?
?
聚合函數
- 使用aggregate()過濾器調用聚合函數
- 聚合函數包括:Avg,Count,Max,Min,Sum,被定義在django.db.models中
- 例:查詢圖書的總閱讀量
from django.db.models importSum
...
list = BookInfo.books.aggregate(Sum('bread'))
?
- 使用count時一般不使用aggregate()過濾器
- 例:查詢圖書總數
list = BookInfo.books.count()
總結
- 上一篇: 利用python批量修改文件名称
- 下一篇: python抽象基类的作用_Python