VB.net 2010 視頻教程 VB.net 2010 視頻教程 VB.net 2010 視頻教程
SQL Server 2008 視頻教程 c#入門經典教程 Visual Basic從門到精通視頻教程
當前位置:
魔兽世界wow > 編程開發 > Python >
  • python基礎教程之查詢集 QuerySet和管理器Manager

  • 2019-05-27 22:08 來源:未知

魔兽世界wow www.geyjm.icu 查詢集 QuerySet

查詢集,也稱查詢結果集、QuerySet,表示從數據庫中獲取的對象集合。

當調用如下過濾器方法時,Django會返回查詢集(而不是簡單的列表):

  • all():返回所有數據。
  • filter():返回滿足條件的數據。
  • exclude():返回滿足條件之外的數據。
  • order_by():對結果進行排序。

 

對查詢集可以再次調用過濾器進行過濾,如

BookInfo.objects.filter(bread__gt=30).order_by('bpub_date')

從SQL的角度講,查詢集與select語句等價,過濾器像where、limit、order by子句。

判斷某一個查詢集中是否有數據

  • exists():判斷查詢集中是否有數據,如果有則返回True,沒有則返回False。

 

1>惰性執行

創建查詢集不會訪問數據庫,直到調用數據時,才會訪問數據庫,調用數據的情況包括迭代、序列化、與if合用

例如,當執行如下語句時,并未進行數據庫查詢,只是創建了一個查詢集qs

qs = BookInfo.objects.all()

繼續執行遍歷迭代操作后,才真正的進行了數據庫的查詢

for book in qs:
    print(book.btitle)

2>緩存

使用同一個查詢集,第一次使用時會發生數據庫的查詢,然后Django會把結果緩存下來,再次使用這個查詢集時會使用緩存的數據,減少了數據庫的查詢次數。

qs=BookInfo.objects.all()
[book.id for book in qs]
[book.id for book in qs]

 

3>限制查詢集

可以對查詢集進行取下標或切片操作,等同于sql中的limit和offset子句。

注意:不支持負數索引。

對查詢集進行切片后返回一個新的查詢集,不會立即執行查詢

如果獲取一個對象,直接使用[0],等同于[0:1].get(),但是如果沒有數據,[0]引發IndexError異常,[0:1].get()如果沒有數據引發DoesNotExist異常。

示例:獲取第1、2項,運行查看。

qs = BookInfo.objects.all()[0:2]

 

管理器manager

自定義manager

 

注意:一旦為模型類指明自定義的過濾器后,Django不再生成默認管理對象objects。

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

a.打開booktest/models.py文件,定義類BookInfoManager

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

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

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

c.使用方法

BookInfo.books.all()

 

在管理器類中補充定義的新方法

a.打開booktest/models.py文件,定義方法create。

復制代碼
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.is_delete = 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))

相關教程