Django模型[條件查詢]

演示: 運(yùn)行項(xiàng)目shell

python manage.py shell

導(dǎo)入全部

from booktest.models import *

獲取數(shù)據(jù)
  • values('數(shù)據(jù)名字')
    [i.屬性 for i in list]

條件查詢

exact:表示判等

例:查詢編號(hào)為1的圖書。
list=BookInfo.objects.filter(id__exact=1)
可簡(jiǎn)寫為:
list=BookInfo.objects.filter(id=1)

模糊查詢

contains:是否包含。

說明:如果要包含%無需轉(zhuǎn)義,直接寫即可。

例:查詢書名包含'傳'的圖書。
list = BookInfo.objects.filter(btitle__contains='傳')

startswith、endswith:以指定值開頭或結(jié)尾。

例:查詢書名以'部'結(jié)尾的圖書
list = BookInfo.objects.filter(btitle__endswith='部')

以上運(yùn)算符都區(qū)分大小寫,在這些運(yùn)算符前加上i表示不區(qū)分大小寫,如iexact、icontains、istartswith、iendswith.

空查詢

isnull:是否為null。

例:查詢書名不為空的圖書。
list = BookInfo.objects.filter(btitle__isnull=False)

范圍查詢

in:是否包含在范圍內(nèi)。

例:查詢編號(hào)為1或3或5的圖書
list = BookInfo.objects.filter(id__in=[1, 3, 5])

比較查詢gt、gte、lt、lte:大于、大于等于、小于、小于等于。

例:查詢編號(hào)大于3的圖書
list = BookInfo.objects.filter(id__gt=3)

不等于的運(yùn)算符,使用exclude()過濾器。

例:查詢編號(hào)不等于3的圖書
list = BookInfo.objects.exclude(id=3)

日期查詢year、month、day、week_day、hour、minute、second:對(duì)日期時(shí)間類型的屬性進(jìn)行運(yùn)算。

例:查詢1980年發(fā)表的圖書。
list = BookInfo.objects.filter(bpub_date__year=1980)

例:查詢1980年1月1日后發(fā)表的圖書。
list = BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))

F對(duì)象之前的查詢都是對(duì)象的屬性與常量值比較,兩個(gè)屬性怎么比較呢?

答:使用F對(duì)象,被定義在django.db.models中。

語法如下:
F(屬性名)
例:查詢閱讀量大于等于評(píng)論量的圖書。

from django.db.models import F
...
list = BookInfo.objects.filter(bread__gte=F('bcomment'))
可以在F對(duì)象上使用算數(shù)運(yùn)算。
例:查詢閱讀量大于2倍評(píng)論量的圖書。
list = BookInfo.objects.filter(bread__gt=F('bcomment') * 2)Q對(duì)象
多個(gè)過濾器逐個(gè)調(diào)用表示邏輯與關(guān)系,同sql語句中where部分的and關(guān)鍵字。
例:查詢閱讀量大于20,并且編號(hào)小于3的圖書。

list=BookInfo.objects.filter(bread__gt=20,id__lt=3)

list=BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)

如果需要實(shí)現(xiàn)邏輯或or的查詢,需要使用Q()對(duì)象結(jié)合|運(yùn)算符,Q對(duì)象被義在django.db.models中。

語法如下:
Q(屬性名__運(yùn)算符=值)
例:查詢閱讀量大于20的圖書,改寫為Q對(duì)象如下。

from django.db.models import Q
...
list = BookInfo.objects.filter(Q(bread__gt=20))

Q對(duì)象可以使用&、|連接,&表示邏輯與,|表示邏輯或。

例:查詢閱讀量大于20,或編號(hào)小于3的圖書,只能使用Q對(duì)象實(shí)現(xiàn)
list = BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
Q對(duì)象前可以使用~操作符,表示非not。
例:查詢編號(hào)不等于3的圖書。
list = BookInfo.objects.filter(~Q(pk=3))聚合函數(shù)
使用aggregate()過濾器調(diào)用聚合函數(shù)。聚合函數(shù)包括:Avg,Count,Max,Min,Sum,被定義在django.db.models中。
例:查詢圖書的總閱讀量。

from django.db.models import Sum
...
list = BookInfo.objects.aggregate(Sum('bread'))
注意aggregate的返回值是一個(gè)字典類型,格式如下:

{'聚合類小寫__屬性名':值}
如:{'sum__bread':3}
使用count時(shí)一般不使用aggregate()過濾器。
例:查詢圖書總數(shù)。
list = BookInfo.objects.count()
注意count函數(shù)的返回值是一個(gè)數(shù)字。



返回查詢集的過濾器如下:

all()

  • 返回模型類對(duì)應(yīng)表的所有數(shù)據(jù),返回值是QuerySet類型

filter()

  • 返回滿足條件的數(shù)據(jù),返回值是QuerySet類型,參數(shù)可以寫查詢條件

exclude()

  • 返回滿足條件之外的數(shù)據(jù)(即:不滿足條件的數(shù)據(jù)),返回值是QuerySet類型,參數(shù)可以寫查詢條件
  • 提示:相當(dāng)于sql語句中where部分的not關(guān)鍵字

order_by()

  • 對(duì)結(jié)果進(jìn)行排序,返回值是QuerySet類型,參數(shù)可以寫排序中的字段
  • '-屬性' 逆序查詢

返回單個(gè)值的過濾器如下:2.1 get()

  • 返回單個(gè)滿足條件的對(duì)象(有且只能有一條數(shù)據(jù)),參數(shù)可以是查詢條件
  • 如果未找到會(huì)引發(fā)"模型類.DoesNotExist"異常。
  • 如果多條被返回,會(huì)引發(fā)"模型類.MultipleObjectsReturned"異常。

count()

  • 返回當(dāng)前查詢結(jié)果的總條數(shù),返回值是一個(gè)數(shù)字.

aggregate()

  • 進(jìn)行聚合操作,返回一個(gè)字典。
from django.db.models import Sum,Count,Avg,Max,Min3. 判斷某一個(gè)查詢集中是否有數(shù)據(jù):

exists():判斷查詢集中是否有數(shù)據(jù),如果有則返回True,沒有則返回False。二、查詢集兩大特性1、惰性查詢

  • 惰性查詢:只有在實(shí)際使用查詢集中的數(shù)據(jù)的時(shí)候,才會(huì)發(fā)生對(duì)數(shù)據(jù)庫的真正查詢, 調(diào)用數(shù)據(jù)的情況包括迭代,序列化,與if合用

示例:查詢所有,編輯booktest/views.py的index視圖,運(yùn)行查看。

list=BookInfo.objects.all()
2、查詢集的緩存

  • 當(dāng)使用的是同一個(gè)查詢集時(shí),第一次的時(shí)候會(huì)發(fā)生實(shí)際數(shù)據(jù)庫的查詢,然后把結(jié)果緩存起來,之后再使用這個(gè)查詢集時(shí),使用的是緩存中的結(jié)果集

演示: 運(yùn)行項(xiàng)目shell

python manage.py shell 情況一:如下是兩個(gè)查詢集,無法重用緩存,每次查詢都會(huì)與數(shù)據(jù)庫進(jìn)行一次交互,增加了數(shù)據(jù)庫的負(fù)載。

from booktest.models import BookInfo
[book.id for book in BookInfo.objects.all()]
[book.id for book in BookInfo.objects.all()]情況二:經(jīng)過存儲(chǔ)后,可以重用查詢集,第二次使用緩存中的數(shù)據(jù)。

list=BookInfo.objects.all()
[book.id for book in list]
[book.id for book in list]


限制查詢集

  • 可以對(duì)一個(gè)查詢集進(jìn)行 取下標(biāo)或切片 操作,等同于sql中的limit和offset子句。
注意:不支持負(fù)數(shù)索引。
  • 對(duì)查詢集進(jìn)行切片后返回一個(gè)新的查詢集,不會(huì)立即執(zhí)行查詢。
  • 如果獲取一個(gè)對(duì)象,直接使用[0],等同于[0:1].get(),但是如果沒有數(shù)據(jù),[0]引發(fā)IndexError異常,[0:1].get()如果沒有數(shù)據(jù)引發(fā)DoesNotExist異常。
  • 示例:獲取第1、2項(xiàng),運(yùn)行查看。

list=BookInfo.objects.all()[0:2]
方式說明b[0]如果b[0]不存在,會(huì)拋出IndexError異常b[0:1].get()

如果b[0:1].get()不存在,會(huì)拋出DoesNotExist 異常。


mysql導(dǎo)入sql文件

source (文件名需一致,列名類型需一致)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容