日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django模型

發布時間:2024/7/5 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()

總結

以上是生活随笔為你收集整理的Django模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。