日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

django之ORM查询操作(二)

發(fā)布時(shí)間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 django之ORM查询操作(二) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 查詢集
  • 基礎(chǔ)條件查詢--針對(duì)一個(gè)屬性
  • F和Q對(duì)象
  • 聚合函數(shù)
    • 統(tǒng)計(jì)總的閱讀量
  • 關(guān)聯(lián)查詢
    • 基礎(chǔ)關(guān)聯(lián)查詢
    • 內(nèi)連接查詢
    • 自關(guān)聯(lián)查詢

查詢集

查詢集:

  • 表示從數(shù)據(jù)庫(kù)中獲取的模型對(duì)象集合
  • 在管理器上調(diào)用過濾器方法會(huì)返回查詢集
  • 查詢集可以含有0個(gè)、一個(gè)或多個(gè)過濾器
  • 過濾器:基于所給的參數(shù)限制查詢的結(jié)果

返回列表的過濾器如下:

  • all():返回所有的數(shù)據(jù)(以對(duì)象形式)
  • filter():返回滿足條件的數(shù)據(jù)
  • exclude():返回滿足條件之外的數(shù)據(jù),相當(dāng)于sql語(yǔ)句中where部分的not關(guān)鍵字
  • order_by():返回排序后的數(shù)據(jù)

返回單個(gè)對(duì)象的過濾器如下:

  • get():返回單個(gè)滿足條件的對(duì)象
  • 如果未找到會(huì)引發(fā)"模型類.DoesNotExist"異常
  • 如果多條被返回,會(huì)引發(fā)"模型類.MultipleObjectsReturned"異常
  • count():返回當(dāng)前查詢的總條數(shù)
  • aggregate():聚合
  • exists():判斷查詢集中是否有數(shù)據(jù),如果有則返回True,沒有則返回False

查詢集特點(diǎn)

  • 1.惰性執(zhí)行:創(chuàng)建查詢集不會(huì)訪問數(shù)據(jù)庫(kù),直到在模板中調(diào)用數(shù)據(jù)時(shí),才會(huì)訪問數(shù)據(jù)庫(kù)
  • 調(diào)用數(shù)據(jù)的情況包括迭代、序列化、與if合用
  • 2.緩存:查詢集的結(jié)果被存下來之后,再次查詢相同數(shù)據(jù)時(shí)會(huì)使用之前緩存的數(shù)據(jù)

查詢集緩存

  • 每個(gè)查詢集都包含一個(gè)緩存來最小化對(duì)數(shù)據(jù)庫(kù)的訪問
  • 第一次查詢數(shù)據(jù)后,Django會(huì)將查詢集緩存起來,并返回請(qǐng)求的結(jié)果
  • 再次查詢相同數(shù)據(jù)時(shí)將重用緩存的結(jié)果

限制查詢集

  • 查詢集返回列表,可以使用下標(biāo)的方式進(jìn)行限制,等同于sql中的limit和offset子句

  • 注意:不支持負(fù)數(shù)索引

  • 使用下標(biāo)后返回一個(gè)新的查詢集,不會(huì)立即執(zhí)行查詢

  • 如果獲取一個(gè)對(duì)象,直接使用[0],等同于[0:1].get()

  • 但是如果沒有數(shù)據(jù),[0]引發(fā)IndexError異常,[0:1].get()引發(fā)DoesNotExist異常

# User列表信息視圖 def UserList(request):# 列表下標(biāo)限制查詢集 :查詢第1,2項(xiàng)UserInfos = UserInfo.user.all()[0:2]# 構(gòu)造上下文context = {'userlist':UserInfos}return render(request, 'user/userlist.html', context)

基礎(chǔ)條件查詢–針對(duì)一個(gè)屬性

查詢語(yǔ)法:模型屬性_條件運(yùn)算符=值

  • 說明:查詢語(yǔ)句是屬性名稱和比較運(yùn)算符間使用兩個(gè)下劃線相連,所以定義的模型屬性名不能包括多個(gè)下劃線
  • 實(shí)現(xiàn)sql中where的功能,可以調(diào)用過濾器filter()、exclude()、get()

查詢實(shí)現(xiàn)

  • 1.查詢id為1的書籍 (exact : 判斷相等)
bookInfos = BookInfo.books.filter(id__exact=1)
  • 2.查詢書名包含‘湖’的書籍 (contains : 是否包含)
bookInfos = BookInfo.books.filter(name__contains='湖')
  • 3.查詢書名以‘部’結(jié)尾的書籍 (startswith/endswith : 以什么開頭/以什么結(jié)尾)
bookInfos = BookInfo.books.filter(name__endswith='部')
  • 4.查詢書名不為空的書籍 (isnull : 是否為null)
bookInfos = BookInfo.books.filter(name__isnull=False)
  • 5.查詢編號(hào)為2或4的書籍(pk:主鍵/id) (in : 是否包含在范圍內(nèi))
bookInfos = BookInfo.books.filter(pk__in=[2,4])
  • 6.查詢編號(hào)大于2的書籍(gt/大于、gte/大于等于、lt/小于、lte/小)
bookInfos = BookInfo.books.filter(id__gt=2)
  • 7.查詢id不等于3的書籍 (exclude : 條件以外的數(shù)據(jù))
bookInfos = BookInfo.books.exclude(id=3)
  • 8.查詢1980年發(fā)表的書籍(year、month、day、week_day、hour、minute、second : 對(duì)日期時(shí)間類型的屬性進(jìn)行運(yùn)算)
bookInfos = BookInfo.books.filter(pub_date__year=1980)
  • 9.查詢1990年1月1日后發(fā)表的書籍
from datetime import datebookInfos = BookInfo.books.filter(pub_date__gt=date(1990,1,1))

提示:

  • exact、contains、startswith、endswith運(yùn)算符都區(qū)分大小寫

  • 在這些運(yùn)算符前加上i表示不區(qū)分大小寫

  • 如iexact、icontains、istartswith、iendswith

F和Q對(duì)象

F對(duì)象:用于兩個(gè)屬性的比較
語(yǔ)法:

from django.db.models import FF('屬性名')
  • F對(duì)象查詢需求

  • 1.查詢閱讀量大于評(píng)論量的書籍

bookInfos = BookInfo.books.filter(readcount__gt=F('commentcount'))
  • 2.查詢閱讀量大于2倍評(píng)論量的書籍 : F對(duì)象支持運(yùn)算
bookInfos = BookInfo.books.filter(readcount__gt=F('commentcount')*2)

Q對(duì)象:多個(gè)過濾器逐個(gè)調(diào)用表示邏輯與關(guān)系,同sql語(yǔ)句中where部分的and關(guān)鍵字

Q對(duì)象語(yǔ)法:

from django.db.models import QQ(模型屬性1__條件運(yùn)算符=) | Q(模型屬性2__條件運(yùn)算符=)

Q對(duì)象查詢需求

  • 1.查詢閱讀量大于20,或編號(hào)小于3的圖書
bookInfos = BookInfo.books.filter(Q(readcount__gt=20) | Q(id__lt=3))
  • 2.查詢編號(hào)不等于3的書籍 (Q對(duì)象前可以使用~操作符,表示非not)

聚合函數(shù)

  • 使用aggregate()過濾器調(diào)用聚合函數(shù),返回單個(gè)對(duì)象

  • 聚合函數(shù)包括:Avg,Max,Min,Sum,Count

  • 使用Count時(shí),一般不需要 aggregate()過濾器,直接調(diào)用即可

  • 被定義在django.db.models中

統(tǒng)計(jì)總的閱讀量

from django.db.models import Sumdef bookList(request):# 查詢編號(hào)不等于3的書籍bookInfos = BookInfo.books.filter(~Q(id=3))# 統(tǒng)計(jì)總的閱讀量readcount = BookInfo.books.aggregate(Sum('readcount'))# 構(gòu)造上下文context = {'booklist':bookInfos,'readcount':readcount}return render(request, 'Book/booklist.html', context)

注意上下文字典取總閱讀量時(shí)的key的書寫規(guī)則

關(guān)聯(lián)查詢

基礎(chǔ)關(guān)聯(lián)查詢

  • 1.查詢編號(hào)為1的圖書中所有人物信息

  • 通過書找關(guān)聯(lián)的人

# 先查編號(hào)為1的書 book = BookInfo.books.get(pk=1) # 再通過關(guān)聯(lián)查詢到編號(hào)為1的書里面的任務(wù)信息 peopleInfos = book.peopleinfo_set.all()
  • 2.查詢編號(hào)為1的英雄出自的書籍

  • 通過人找關(guān)聯(lián)的書

# 先查編號(hào)為1的人物 people = PeopleInfo.objects.get(pk=1) # 再通過關(guān)聯(lián)查詢編號(hào)為1的人物對(duì)應(yīng)的書 bookInfo = people.book

內(nèi)連接查詢

語(yǔ)法如下 :

關(guān)聯(lián)模型類名小寫__屬性名__運(yùn)算符=
  • 結(jié)果和sql中的inner join相同(內(nèi)連接)

  • 1.查詢書名為"紅樓夢(mèng)"的所有人物信息(peopleInfo)

  • 通過書找關(guān)聯(lián)的人

# 原始內(nèi)連接sql語(yǔ)句: select p.name, b.name from peopleinfo as p inner join bookinfo as b on p.book_id = b.id where b.name = "紅樓夢(mèng)"; peopleInfos = PeopleInfo.objects.filter(book__name='紅樓夢(mèng)')
  • 2.查詢書籍中人物的描述包含"紅"的書籍

  • 通過人找關(guān)聯(lián)的書

bookInfos = BookInfo.books.filter(peopleinfo__description__contains='紅')

自關(guān)聯(lián)查詢

  • 自關(guān)聯(lián)的表結(jié)構(gòu):對(duì)于地區(qū)信息、分類信息等數(shù)據(jù),表結(jié)構(gòu)非常類似,每個(gè)表的數(shù)據(jù)量十分有限,為了充分利用數(shù)據(jù)表的大量數(shù)據(jù)存儲(chǔ)功能,可以設(shè)計(jì)成一張表,內(nèi)部的關(guān)系字段指向本表的主鍵
  • 說明:關(guān)系屬性使用self指向本類,要求null和blank允許為空,因?yàn)橐患?jí)數(shù)據(jù)是沒有父級(jí)的
# 地區(qū)列表信息class AreaInfo(models.Model):name = models.CharField(max_length=30) #名稱parent = models.ForeignKey('self',null=True,blank=True) #關(guān)系# 元類信息 :修改表名class Meta:db_table = 'areainfo'

參考鏈接

總結(jié)

以上是生活随笔為你收集整理的django之ORM查询操作(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。