[轉]Django 資料庫基本查詢方法
阿新 • • 發佈:2021-12-16
人物表info
欄位 | 說明 |
---|---|
id | 主鍵自增 |
name | 不能為null |
age | default為0 |
update_time | 更新為最後一次修改的時間 |
基礎查詢方法
- get 查詢單一結果,模型類例項,如果不存在會丟擲模型類 DoesNotExist 異常
- filter 過濾出多個結果,返回 QuerySet 型別物件
- exclude 排除掉符合條件剩下的結果,返回 QuerySet 型別物件
- all 查詢所有結果,返回 QuerySet 型別物件
- count 查詢結果數量
過濾條件
表達語法如下:
屬性名稱__運算子=值
語法 | 條件 |
---|---|
id__exact=3 (省略寫法: id=3) | 查詢id=3的資料 |
name__contains='e' | 查詢name包含e的資料 |
name__startswith='M' | 查詢name以M開頭的資料 |
name__endswith='s' | 查詢name以s結尾的資料 |
date__isnull=True | 查詢date為空的資料 |
id__in=[1,2,3] | 查詢id為1或2或3的資料 |
id__gt=3 (gt: greater than) | 查詢id大於3的資料 |
id__gte=3 (gte: greater than equal) | 查詢id大於等於3的資料 |
id__lt=2 (lt: less than) | 查詢id小於2的資料 |
id__lte=2 (lte: less than equal) | 查詢id小於等於2的資料 |
date__month=2 | 查詢日期為二月的資料 |
date__gt = '1999-01-01' | 查詢date1999-01-01之後的資料 |
F物件
用於屬性間對比,以及一些算術運算,語法規則如下:
F('屬性名')
# F參為屬性名,即表的欄位
from demo.models import Infofrom django.db.models import F# 查詢條件:id大於2倍age的資料Info.objects.filter(id__gt=F('age' )*2)
Q物件
用於邏輯運算,與&、或|、非~ ,語法規則如下:
Q(過濾條件)
from demo.models import Infofrom django.db.models import Q# 查詢id大於3且age小於20的資料(id__gt=3, age_lt=20) # 基礎寫法Q(id__gt=3) & Q(age_lt=20)# 查詢id大於3或age小於20的資料Q(id__gt=3) | Q(age_lt=20)# 查詢age不等於20的資料~Q(age=20)
聚合函式
QuerySet 和 Model.objects 都有 aggregate() 函式,可以進行統計計算
- aggregate()的引數是django.db.models.Aggregate 型別的物件
- 返回值是字典,包含聚合計算後的結果
- 格式是
{'屬性名_聚合型別小寫': 值}
,比如{'name_sum': 10}
Aggregate 型別的子類:
- Avg 平均值
- Count 數量
- Max 最大值
- Min 最小值
- Sum 求和
- StdDev 標準差
- Variance 方差
from demo.models import Infofrom django.db.models import Avg, Count, Sum# 查詢id大於2的人的數量和年齡的總和Info.objects.filter(id__gt=2).aggregate(Count('id'), Sum('age'))# 返回值: {'id_count':20, 'age_sum': 300}# 查詢年齡不等於20歲的人的平均年齡Info.objects.exclude(age=20).aggregate(Avg('age'))# 返回值: {'age_avg': 20}
注:計算count時一般不使用aggregate(),對於QuerySet型別可直接使用count(),返回值是一個數字
# 查詢年齡大於20歲的人數Info.objects.filter(age__gt=20).count()
排序函式
QuerySet 和 objects 都有 order_by()方法對查詢結果進行排序
# 對id欄位升序Info.objects.all().order_by('id')# 對id欄位降序,前加個 -Info.objects.all().order_by('-id')
關聯查詢
兩個模型類,對應資料庫中一個主表一個從表
班級模型類ClassTable
屬性 | 說明 |
---|---|
id | 主鍵自增 |
name | 班名 |
學生模型類StudentTable
屬性 | 說明 |
---|---|
id | 主鍵自增 |
name | 學生名 |
age | 學生年齡 |
clas | 外來鍵,關聯班級類 |
主對從的查詢
語法: 主的模型類物件.從的模型類小寫_set
# 查詢班名為一班的所有學生資訊ClassTale.objects.get(class='一班').studenttable_set.all()
從對主的查詢
語法: 從的模型類物件.所關聯主類的屬性名
# 查詢id為20的學生所屬的班級資訊StudentTable.objects.get(id=20).clas# 查詢id為20的學生所屬的班級idStudentTable.objects.get(id=20).clas_id
關聯過濾查詢
由從的模型類條件查詢主模型類的資料
語法: 從的模型類名小寫__屬性名__條件運算子=值
注: 如果沒有"__運算子"部分,表示等於。
如果一個主類的多個從類都滿足條件,會返回多個該主類
# 查詢學生姓名中包含'張三'的班級資訊ClassTable.objects.filter(studenttable__name__contains='張三')
由主的模型類條件查詢從模型類的資料
語法: 從的模型類的關聯屬性__主模型類的屬性名__條件運算子=值
注: 如果沒有"__運算子"部分,表示等於。
# 查詢班級名包含'一班'的所有學生資訊StudentTable.objects.filter(clas__name__contains='一班')
---------------------
作者:MilesMa
來源:CNBLOGS
原文:https://www.cnblogs.com/milesma/p/12411951.html
版權宣告:本文為作者原創文章,轉載請附上博文連結!