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 Info
from django.db.models import F

# 查詢條件:id大於2倍age的數據
Info.objects.filter(id__gt=F('age')*2)

Q對象

用於邏輯運算,與&、或|、非~ ,語法規則如下:

Q(過濾條件)

from demo.models import Info
from 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 Info
from 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的學生所屬的班級id
StudentTable.objects.get(id=20).clas_id

關聯過濾查詢

由從的模型類條件查詢主模型類的數據

語法: 從的模型類名小寫__屬性名__條件運算符=值

注: 如果沒有"__運算符"部分,表示等於。

如果一個主類的多個從類都滿足條件,會返回多個該主類

# 查詢學生姓名中包含'張三'的班級信息
ClassTable.objects.filter(studenttable__name__contains='張三')
由主的模型類條件查詢從模型類的數據

語法: 從的模型類的關聯屬性__主模型類的屬性名__條件運算符=值

注: 如果沒有"__運算符"部分,表示等於。

# 查詢班級名包含'一班'的所有學生信息
StudentTable.objects.filter(clas__name__contains='一班')


免責聲明!

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



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