91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

django的模型類管理器——數據庫操作的封裝詳解

發布時間:2020-10-12 05:15:12 來源:腳本之家 閱讀:262 作者:稀里糊涂林老冷 欄目:開發技術

模型實例方法

str():在將對象轉換成字符串時會被調用。

save():將模型對象保存到數據表中,ORM框架會轉換成對應的insert或update語句。

delete():將模型對象從數據表中刪除,ORM框架會轉換成對應的delete語句。

模型類的屬性

屬性objects:管理器,是Manager類型的對象,用于與數據庫進行交互。

當沒有為模型類定義管理器時,Django會為模型類生成一個名為objects的管理器,自定義管理器后,Django不再生成默認管理器objects。

管理器是Django的模型進行數據庫操作的接口,Django應用的每個模型都擁有至少一個管理器。Django支持自定義管理器類,繼承自models.Manager。

自定義管理器類主要用于兩種情況:

1.修改原始查詢集,重寫all()方法

2.向管理器類中添加額外的方法,如向數據庫中插入數據。

1.修改原始查詢集,重寫all()方法。

#圖書管理器
class BookInfoManager(models.Manager):
 def all(self):
  #默認查詢未刪除的圖書信息
  #調用父類的成員語法為:super().方法名
  return super().all().filter(isDelete=False)

b)在模型類BookInfo中定義管理器

class BookInfo(models.Model):
 ...
 books = BookInfoManager()

2.在管理器類中定義創建對象的方法

當創建模型類對象時,django不會對數據庫進行讀寫操作,調用save()方法才與數據庫交互,進行insert或update操作,將數據保存到數據庫中。如果模型類的屬性比較多,逐個屬性賦值很麻煩,推薦使用管理器

class BookInfoManager(models.Manager):
 ...
 #創建模型類,接收參數為屬性賦值
 def create_book(self, title, pub_date):
  #創建模型類對象self.model可以獲得模型類
  book = self.model()
  book.btitle = title
  book.bpub_date = pub_date
  book.bread=0
  book.bcommet=0
  book.isDelete = False
  # 將數據插入進數據表
  book.save()
  return book

b)為模型類BookInfo定義管理器books語法如下

class BookInfo(models.Model):
 ...
 books = BookInfoManager()

c)調用語法如下:

調用:

book=BookInfo.books.create_book("abc",date(1980,1,1))

補充知識:Django中的模型類管理器以及自定義管理器

模型類.objects.all()->objects是一個什么東西呢?

答:objects是Django幫我自動生成的管理器對象,通過這個管理器可以實現對數據的查詢。

objects是models.Manger類的一個對象

自定義管理器之后Django不再幫我們生成默認的objects管理器。

使用博客之前使用過的模型類,然后在項目的shell中導入模型類,進行查看類型

django的模型類管理器——數據庫操作的封裝詳解

自定義模型管理器類

自定義一個管理器類,這個類繼承models.Manger類。

再在具體的模型類里定義一個自定義管理器類的對象。

定義一個模型管理器類,然后在模型類中使用

class BookInfoManager(models.Manager):
 """圖書模型管理器類"""
 pass
 
class BookInfo(models.Model):
 """圖書模型類"""
 # 圖書名稱
 btitle = models.CharField(max_length=20)
 # 出版日期
 bpub_date = models.DateField()
 # 閱讀量
 bread = models.IntegerField(default=0)
 # 評論量
 bcomment = models.IntegerField(default=0)
 # 刪除標記
 isDelete = models.BooleanField(default=False)
 
 '''自定義管理器'''
 book = BookInfoManager()

然后在項目的shell中,

我們一旦自定義了管理器,就要使用定義的管理器查詢,可以看到我們自定義的Manager

django的模型類管理器——數據庫操作的封裝詳解

自定義管理器類的應用場景

1.改變查詢的結果集。

比如調用BookInfo.books.all()返回的是沒有刪除的圖書的數據。

2.添加額外的方法。

管理器類中定義一個方法幫我們操作模型類對應的數據表。

使用self.model()就可以創建一個跟自定義管理器對應的模型類對象。

1.舉例,模型類對應的表中有這個表

django的模型類管理器——數據庫操作的封裝詳解

現在通過BookInfo.book.all()自定義管理器只取到isDelete為0的數據

重寫all()方法,如果有其他的需求的時候可以重新其他對應的方法

class BookInfoManager(models.Manager):
 """圖書模型管理器類"""
 # 改變查詢的結果集
 def all(self):
  # 1.調用父類的all,獲取所有數據
  books = super().all() # QuerySet
  # 2.對數據進行過濾
  books = books.filter(isDelete=False)
  # 3.返回books
  return books

然后進行驗證,重新打開項目的shell,進行查詢之后就獲取到了4條數據(過濾掉了一條)

django的模型類管理器——數據庫操作的封裝詳解

2.為模型類添加額外的方法,使其通過模型類.方法名就可以插入保存數據

class BookInfoManager(models.Manager):
 """圖書模型管理器類"""
 
 # 改變查詢的結果集
 def all(self):
  # 1.調用父類的all,獲取所有數據
  books = super().all() # QuerySet
  # 2.對數據進行過濾
  books = books.filter(isDelete=False)
  # 3.返回books
  return books
 
 # 封裝函數:操作模型類對應的數據表
 '''添加額外的方法'''
 def create_book(self, btitle, bpub_date):
  # 1.創建一個圖書對象
  model_class = self.model
  book = model_class()
  book.btitle = btitle
  book.bpub_date = bpub_date
  # 2. 保存進數據庫
  book.save()
  # 3. 返回obj
  return book

然后重新進入到項目的shell中進行插入,注意:日期要符合日期字符串的格式,或者使用date()函數

django的模型類管理器——數據庫操作的封裝詳解

數據中也相應的有了該條數據,因為我們在額外的方法中使用了save()函數保存到數據庫

django的模型類管理器——數據庫操作的封裝詳解

這個額外的方法通常寫在管理器中,當然也可以寫在模型類中,當寫在模型類中,使用的時候則直接模型類調用該方法就行了,并且定義成模型類的類方法。注意區別

把方法定義在管理器的時候,管理器中有個自帶的方法create(),使用這個時候必須帶參數

django的模型類管理器——數據庫操作的封裝詳解

數據庫就已經有了

django的模型類管理器——數據庫操作的封裝詳解

模型管理器類和模型類的關系

django的模型類管理器——數據庫操作的封裝詳解

以上這篇django的模型類管理器——數據庫操作的封裝詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

昆山市| 通海县| 罗江县| 淮滨县| 九龙城区| 江孜县| 中方县| 文安县| 修文县| 博爱县| 佛学| 仁化县| 屏东县| 丰县| 莒南县| 华池县| 云和县| 西平县| 余庆县| 荣昌县| 永德县| 筠连县| 黄陵县| 神木县| 康马县| 封丘县| 获嘉县| 淮安市| 教育| 威远县| 邵阳市| 右玉县| 镇坪县| 辉县市| 斗六市| 宾川县| 仙游县| 武清区| 仁化县| 博野县| 周至县|