1. 程式人生 > 其它 >[轉]Django 資料庫基本查詢方法

[轉]Django 資料庫基本查詢方法

人物表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
版權宣告:本文為作者原創文章,轉載請附上博文連結!