Django項目的ORM操作之--模型類數據查詢
1.查詢基本格式及理解: 類名.objects.[查詢條件]
例如我們要查詢數據庫中一張表(bookinfo)的所有數據,sql語句為:select * from bookinfo,
對應模型類的操作是: BookInfo.objects.all()
cd到當前django項目的目錄下,進入攜帶django環境的python解釋器進行測試操作:
$ python manage.py shell
$ from book_app.models import *
即可進行模型對象的語句語句操作,執行以下語句看看我們查詢的到底是什麽東西
$ type(BookInfo.objects) --> <class ‘django.db.models.manager.Manager‘>
$ type(BookInfo.objects.all()) --> <class ‘django.db.models.manager.Manager.QuerySet‘>
$ type(BookInfo.objects.all()[0]) --> <class ‘django.db.models.manager.Manager.BookInfo‘>
也就是說,objects是一個模塊對象管理器,objects.all是一個查詢集QuerySet,
取查詢集的第一個元素QuerySet[0],可以看到查詢集裏面存的元素就是符合條件的我們設計表時所創建類BookInfo的實例對象
QuerySet查詢集支持小標和切片,切片返回的是一個新的查詢集
2.查詢集之過濾器:
多對象過濾器:
all() --> 返回所有數據
filter([條件]) --> 返回滿足條件的所有數據
exclude([條件]) --> 返回滿足條件外的所有數據
order_by([條件]) --> 根據條件排序,並返回 (可以用‘-‘實現倒序)
單對象過濾器:
get([條件]) --> 返回滿足條件的單個數據;如果未找到將拋出異常:DoesNotExist;如果找到的是多條將拋出異常:MultipleObjectsReturned
count() --> 返回查詢結果總數
aggregate() --> 聚合,返回一個字典 (聚合函數:Avg、Max、Min、Sum、Count,例: objects.aggregate(Sum("name")))
判空:
exists() --> 判斷查詢集中是否有數據,有為True
返回具體對象屬性值:
values([屬性名]) --> 返回一個列表,以字典形式存放所有對象的屬性值
values_list([屬性名]) --> 返回一個列表,以列表形式存放所有對象的屬性值
3.filter查詢集的條件查詢:
查詢條件的格式: [屬性名稱]__[運算符]=[值] (註意是兩個"_",我們在對屬性命名時不允許使用雙"_")
屬性大小、範圍查詢:
等於:屬性=值 大於:屬性__gt=值 大於等於:屬性__gte=值
小於:屬性__lt=值 小於等於:屬性__lte=值 範圍:屬性_in=值(值應為可選項的列表,例: id_in=[1,3,5],指定id=1、3、5的3個數據)
查詢屬性為空的/不為空:
屬性__isnull=True/False
屬性模糊查詢:
指定開頭:屬性__startwith=值 指定結尾:屬性__endwith=值
指定日期(屬性值應為日期相應類型):屬性_year=值 屬性_month=值(例:birthday_month=11,指定birthday的月份為11月的數據)
F對象和Q對象: 需先導入: from django.db.models import F,Q
F對象:不知道某個屬性的值,也可以用它來進行比較,例: filter(read_gt=F(‘comment‘)*2), 查詢閱讀數量大於評論數量2倍的數據
Q對象:實現邏輯與、非的查詢
與: objects.filter(read_gt=20).filter(comment_gt=20) 閱讀和評論數都大於20
或: objects.filter(Q(read_gt=20 | comment_gt=20)) 閱讀數大於20或評論數大於20
非: objects.filter(-Q(read_gt=20)) 閱讀數不大於20
4.過濾器的特性:懶惰和緩存
懶惰:創建查詢集不會訪問數據庫,直到調用數據時,才會訪問數據庫,調用數據的情況包括叠代、序列化、與if合用等
緩存:使用同一個查詢集,第一次使用時會發生數據庫的查詢,然後把結果緩存下來,再次使用這個查詢集時會使用緩存的數據。
Django項目的ORM操作之--模型類數據查詢