Django中ORM的惰性機制

2022-08-21 12:15:13 字數 2624 閱讀 2433

django惰性機制

所謂惰性機制:publisher.objects.all()或者.filter()等都只是返回了乙個queryset(查詢結果集物件),它並不會馬上執行sql,而是當呼叫queryset的時候才執行。

惰性機制之可迭代12

3# objs=models.book.objects.all() # [obj1,obj2,ob3...]

#forobjinobjs: # 每一obj就是乙個行物件,此時會執行sql

#     print("obj:",obj)

惰性機制之可切片12

34# objs=models.book.objects.all() # [obj1,obj2,ob3...]

# print(objs[1])

# print(objs[1:4])

# print(objs[::-1])

惰性機制之django快取問題

django有自己的快取,如果2次的obj物件一致,第二次的查值直接從快取中取值。

如果期間資料庫的內容作了更改,則需要重新查值。否則容易產生髒資料。

可以直接利用第一次的obj物件直接進行update操作,這樣下次for迴圈查詢時又重新執行了資料庫查詢操作,此時快取也作了更改; 也可以重新手動查詢一下結果,但是不推薦這樣,因為我們並不知道資料什麼時候會進行修改,妥善的還是django用資料時自己去查詢資料結果

注意1:如果2次操作之間有資料進行了修改 ,則需要重新從資料庫中查值,否則django會從快取中取出資料,影響最後的查詢結果。12

3456

789# objs=models.book.objects.all()    # [obj1,obj2,ob3...]

#forobjinobjs:             # 每一obj就是乙個行物件,此時會執行sql

#     print("obj:",obj)

models.bool.update.get(id=2).update('title'='yyy') # 資料庫內更改,快取未更改

# objs=models.book.objects.all()  重新從資料庫內查詢並賦值給objs

# objs.update(title='yyy') 推薦使用,直接資料庫/記憶體都更改了,下面for迴圈查詢時重新執行了資料庫

# objs=models.book.objects.all()    # [obj1,obj2,ob3...]

#forobjinobjs:

#     print("obj:",obj)             # 還是objs物件,所以從快取中取值

正確操作

1. 重新執行查詢 objs=models.book.objects.all() 【不推薦】

2. 利用objs.update(title='yyy');  此時資料庫已經更改,快取內的值也做了更改

注意2:12

3if objs():        查詢資料庫,並且將查詢的所有資料結果放入資料庫內

if objs.exist():  僅僅查詢資料庫,但是不會把所有的資料放入資料庫內,

if obj.iterator():資料放入迭代器內,用一次迭代一次取一次即可

ORM的惰性機制

django惰性機制 所謂惰性機制 publisher.objects.all 或者.filter 等都只是返回了乙個queryset 查詢結果集物件 它並不會馬上執行sql,而是當呼叫queryset的時候才執行。惰性機制之可迭代 objs models.book.objects.all obj1...

diango中orm的惰性機制

那麼首先要知道什麼是orm 那具體orm是什麼呢?在django中,根據 中的類自動生成資料庫的表也叫 code first orm orm在物件導向模型與關係模型之間架起橋梁。通過物件與資料庫之間對映的元資料,自動透明地把編譯語音中的物件持久化到關聯式資料庫裡,對資料庫的操作可以轉換為對物件的操作...

Django 惰性機制

惰性機制 publisher.objects.all 或者.filter 等都只是返回了乙個queryset 查詢結果集物件 它並不會馬上執行sql,而是當呼叫queryset的時候才執行sql,為了測試,我們加上 sql 日誌。在 settings.py 檔案上修改 在最後新增 logging l...