django 中QuerySet特性,支持切片,索引,可迭代(緩存機制)iterator性能優化


Book表的數據顯示

id title   price publish_id 2    Linux      30       1
3    項塔蘭      45       2
4    追風箏的人    39.9      3
5    富爸爸      23        10

創建queryset 視圖 函數,  可以使用的列表的方法,按索引,切片的方法取值,得到一個列表對象

def queryset(request): ret1 = Book.objects.all()[0]  #QuerySet支持索引,切片操作
    # print(ret1) #linux 得到一個具體的對象
    ret2 = Book.objects.all()[1:3] # print(ret2)#<QuerySet [<Book: 項塔蘭>, <Book: 追風箏的人>]>
    # ret3 = Book.objects.all()[:2]
    ret4 = Book.objects.all()[::2]# 按步長取,隔一個取一個,,,[::1}挨着取,一個個都取
    # print(ret3)#<QuerySet [<Book: Linux>, <Book: 項塔蘭>]>

    print(ret4)#[<Book: Linux>, <Book: 追風箏的人>]

 

-----

可迭代特性,  iterator() ,exists()

主要是QuerySet的緩存機制,如果一次從數據庫取出很多數據,就有可能導致程序崩潰,可以利用iterator()方法,做性能優化,

為了判斷獲取到的對象是否有值,沒有必要遍歷所有的對象,用exists()方法()

#可迭代特性
 book_list = Book.objects.all()  #取出數據庫的所有對象,要考慮cache機制,如果數據量太大,程序就會崩潰
#判斷book_list 是否有值,假如有很多數據,就沒有必要全部查一遍才得知有數據,只要查到有1條數據,就可以知道book_list有數據,就exists()方法

  if book_list.exists():
  print('ok') #ok ,說明數據庫有值
 #利用itertor()方法 book_list1 = Book.objects.all().iterator() #這次就不能用2次for循環,第一次for循環,就已經把遍歷完了,
  
book_list1 = Book.objects.all().iterator()  #這次就不能用2for循環,第一次for循環,就已經把遍歷完了,用next()方法每次取出一個值,
print(next(book_list1)) #linux
print(next(book_list1))#項塔蘭
print(next(book_list1))#追風箏的人

Book.objects.filter(id=2).update(price=100.00)#對數據庫數據進行更新,但並沒有執行,只有在用到的時候在執行 for obj in book_list: # 在for循環時開始執行sql語句查詢 print(obj.title,obj.price) #如果for循環2次,打印2次結果,也是執行一次sql語句,因為存在sql的緩存機制,把第一次查詢的結果放到緩存里, #下次從緩存里調 """ Linux 30.00 ---沒有更新數據之前 項塔蘭 45.00 追風箏的人 39.90 富爸爸 23.00 """ """ Linux 100.00 ----更新數據之后 項塔蘭 45.00 追風箏的人 39.90 富爸爸 23.00 """

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM