Python—Django:關於在Django框架中對資料庫的查詢函式,查詢集和關聯查詢

此時一位小白路過發表於2020-10-31

一. 查詢函式(get,filter,exclude)

通過模型類 .objects 屬性可以呼叫如下函式,實現對模型類對應的資料表的查詢。

函式名功能返回值說明
get返回表中滿足條件的一條且只能有一條資料。返回值是一個模型類物件。引數中寫查詢條件。1) 如果查到多條資料,則拋異常MultipleObjectsReturned。2) 查詢不到資料,則拋異常:DoesNotExist。
all返回模型類對應表格中的所有資料。返回值是QuerySet型別查詢集
filter返回滿足條件的資料。返回值是QuerySet型別引數寫查詢條件。
exclude返回不滿足條件的資料。返回值是QuerySet型別引數寫查詢條件。
order_by對查詢結果進行排序。返回值是QuerySet型別引數中寫根據哪些欄位進行排序。

·

a)判等 條件名:exact。

例:查詢編號為1的圖書。

BookInfo.objects.get(id=1)

b)模糊查詢

例:查詢書名包含’傳’的圖書。contains

BookInfo.objects.filter(btitle__contains='傳')

例:查詢書名以’部’結尾的圖書 endswith 開頭:startswith

BookInfo.objects.filter(btitle__endswith='部')

c)空查詢 isnull

例:查詢書名不為空的圖書。isnull

select * from booktest_bookinfo where btitle is not null;
BookInfo.objects.filter(btitle__isnull=False)

d)範圍查詢 in

例:查詢id為1或3或5的圖書。

select * from booktest_bookinfo where id in (1,3,5);
BookInfo.objects.filter(id__in = [1,3,5])

e)比較查詢 gt(greate than) lt(less than) gte(equal) 大於等於lte 小於等於

例:查詢id大於3的圖書。

Select * from booktest_bookinfo where id>3;
BookInfo.objects.filter(id__gt=3)

f)日期查詢

例:查詢1980年發表的圖書。

BookInfo.objects.filter(bpub_date__year=1980)

例:查詢1980年1月1日後發表的圖書。

from datetime import date
BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))

exclude方法示例:

例:查詢id不為3的圖書資訊。

BookInfo.objects.exclude(id=3)

order_by方法示例:
作用:進行查詢結果進行排序。
例:查詢所有圖書的資訊,按照id從小到大進行排序。

BookInfo.objects.all().order_by('id')

例:查詢所有圖書的資訊,按照id從大到小進行排序。

BookInfo.objects.all().order_by('-id')

例:把id大於3的圖書資訊按閱讀量從大到小排序顯示。

BookInfo.objects.filter(id__gt=3).order_by('-bread')

F物件(作用:用於類屬性之間的比較。)

使用之前需要先匯入:

from django.db.models import F

例:查詢圖書閱讀量大於評論量圖書資訊。

BookInfo.objects.filter(bread__gt=F('bcomment'))

例:查詢圖書閱讀量大於2倍評論量圖書資訊。

BookInfo.objects.filter(bread__gt=F('bcomment')*2)

Q物件(作用:用於查詢時條件之間的邏輯關係。not and or,可以對Q物件進行&|~操作。)

使用之前需要先匯入:

from django.db.models import Q

例:查詢id大於3且閱讀量大於30的圖書的資訊。

BookInfo.objects.filter(id__gt=3, bread__gt=30)
BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))

例:查詢id大於3或者閱讀量大於30的圖書的資訊。

BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))

例:查詢id不等於3圖書的資訊。

BookInfo.objects.filter(~Q(id=3))

聚合函式 (作用:對查詢結果進行聚合操作。)

sum count avg max min

aggregate:呼叫這個函式來使用聚合。 返回值是一個字典

使用前需先匯入聚合類:

from django.db.models import Sum,Count,Max,Min,Avg

例:查詢所有圖書的數目。

BookInfo.objects.all().aggregate(Count('id'))
{'id__count': 5}

例:查詢所有圖書閱讀量的總和。

BookInfo.objects.aggregate(Sum('bread'))
{'bread__sum': 126}

count函式 返回值是一個數字(作用:統計滿足條件資料的數目。)

例:統計所有圖書的數目。

BookInfo.objects.all().count()
BookInfo.objects.count()

例:統計id大於3的所有圖書的數目。

BookInfo.objects.filter(id__gt=3).count()

小結:
在這裡插入圖片描述

二. 查詢集

all, filter, exclude, order_by 呼叫這些函式會產生一個查詢集QuerySet 類物件可以繼續呼叫上面的所有函式。

查詢集特性

1)惰性查詢:只有在實際使用查詢集中的資料的時候才會發生對資料庫的真正查詢。

2)快取:當使用的是同一個查詢集時,第一次的時候會發生實際資料庫的查詢,然後把結果快取起來,之後再使用這個查詢集時,使用的是快取中的結果。

限制查詢集

可以對一個查詢集進行取下標或者切片操作來限制查詢集的結果。
對一個查詢集進行切片操作會產生一個新的查詢集,下標不允許為負數。

取出查詢集第一條資料的兩種方式:

方式說明
b[0]如果b[0]不存在,會丟擲IndexError異常
b[0:1].get()如果b[0:1].get()不存在,會丟擲DoesNotExist異常。

exists:判斷一個查詢集中是否有資料。 True False

·

三. 關聯查詢(一對多)

查詢和物件關聯的資料

在一對多關係中,一對應的類我們把它叫做一類,多對應的那個類我們把它叫做多類,我們把多類中定義的建立關聯的類屬性叫做關聯屬性

例:查詢id為1的圖書關聯的英雄的資訊。

b=BookInfo.objects.get(id=1)
b.heroinfo_set.all()

通過模型類查詢:

HeroInfo.objects.filter(hbook__id=1)

例:查詢id為1的英雄關聯的圖書資訊。

h = HeroInfo.objects.get(id=1)
h.hbook

通過模型類查詢:

BookInfo.objects.filter(heroinfo__id=1)

格式:
在這裡插入圖片描述

由一類的物件查詢多類的時候:

一類的物件.多類名小寫_set.all() #查詢所用資料

由多類的物件查詢一類的時候:

多類的物件.關聯屬性  #查詢多類的物件對應的一類的物件

由多類的物件查詢一類物件的id時候:

多類的物件.關聯屬性_id

通過模型類實現關聯查詢

在這裡插入圖片描述

例:查詢圖書資訊,要求圖書關聯的英雄的描述包含’八’。

BookInfo.objects.filter(heroinfo__hcomment__contains='八')

例:查詢圖書資訊,要求圖書中的英雄的id大於3.

BookInfo.objects.filter(heroinfo__id__gt=3)

例:查詢書名為“天龍八部”的所有英雄。

HeroInfo.objects.filter(hbook__btitle='天龍八部')

通過多類的條件查詢一類的資料:

一類名.objects.filter(多類名小寫__多類屬性名__條件名) 

通過一類的條件查詢多類的資料:

多類名.objects.filter(關聯屬性__一類屬性名__條件名)

相關文章