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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Django 模型查询2.3

發(fā)布時間:2023/11/28 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django 模型查询2.3 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

簡介

  • 查詢集表示從數(shù)據(jù)庫中獲取的對象集合
  • 查詢集可以含有零個、一個或多個過濾器
  • 過濾器基于所給的參數(shù)限制查詢的結(jié)果
  • 從Sql的角度,查詢集和select語句等價,過濾器像where和limit子句
  • 接下來主要討論如下知識點(diǎn)
    • 查詢集
    • 字段查詢:比較運(yùn)算符,F對象,Q對象

查詢集

  • 在管理器上調(diào)用過濾器方法會返回查詢集
  • 查詢集經(jīng)過過濾器篩選后返回新的查詢集,因此可以寫成鏈?zhǔn)竭^濾
  • 惰性執(zhí)行:創(chuàng)建查詢集不會帶來任何數(shù)據(jù)庫的訪問,直到調(diào)用數(shù)據(jù)時,才會訪問數(shù)據(jù)庫
  • 何時對查詢集求值:迭代,序列化,與if合用
  • 返回查詢集的方法,稱為過濾器
    • all()
    • filter()
    • exclude()
    • order_by()
    • values():一個對象構(gòu)成一個字典,然后構(gòu)成一個列表返回
  • 寫法:
filter(鍵1=值1,鍵2=值2)
等價于
filter(鍵1=值1).filter(鍵2=值2)
  • 返回單個值的方法
    • get():返回單個滿足條件的對象
      • 如果未找到會引發(fā)"模型類.DoesNotExist"異常
      • 如果多條被返回,會引發(fā)"模型類.MultipleObjectsReturned"異常
    • count():返回當(dāng)前查詢的總條數(shù)
    • first():返回第一個對象
    • last():返回最后一個對象
    • exists():判斷查詢集中是否有數(shù)據(jù),如果有則返回True

限制查詢集

  • 查詢集返回列表,可以使用下標(biāo)的方式進(jìn)行限制,等同于sql中的limit和offset子句
  • 注意:不支持負(fù)數(shù)索引
  • 使用下標(biāo)后返回一個新的查詢集,不會立即執(zhí)行查詢
  • 如果獲取一個對象,直接使用[0],等同于[0:1].get(),但是如果沒有數(shù)據(jù),[0]引發(fā)IndexError異常,[0:1].get()引發(fā)DoesNotExist異常

查詢集的緩存

  • 每個查詢集都包含一個緩存來最小化對數(shù)據(jù)庫的訪問
  • 在新建的查詢集中,緩存為空,首次對查詢集求值時,會發(fā)生數(shù)據(jù)庫查詢,django會將查詢的結(jié)果存在查詢集的緩存中,并返回請求的結(jié)果,接下來對查詢集求值將重用緩存的結(jié)果
  • 情況一:這構(gòu)成了兩個查詢集,無法重用緩存,每次查詢都會與數(shù)據(jù)庫進(jìn)行一次交互,增加了數(shù)據(jù)庫的負(fù)載
print([e.title for e in Entry.objects.all()])
print([e.title for e in Entry.objects.all()])
  • 情況二:兩次循環(huán)使用同一個查詢集,第二次使用緩存中的數(shù)據(jù)
querylist=Entry.objects.all()
print([e.title for e in querylist])
print([e.title for e in querylist])
  • 何時查詢集不會被緩存:當(dāng)只對查詢集的部分進(jìn)行求值時會檢查緩存,但是如果這部分不在緩存中,那么接下來查詢返回的記錄將不會被緩存,這意味著使用索引來限制查詢集將不會填充緩存,如果這部分?jǐn)?shù)據(jù)已經(jīng)被緩存,則直接使用緩存中的數(shù)據(jù)

字段查詢

  • 實(shí)現(xiàn)where子名,作為方法filter()、exclude()、get()的參數(shù)
  • 語法:屬性名稱__比較運(yùn)算符=值
  • 表示兩個下劃線,左側(cè)是屬性名稱,右側(cè)是比較類型
  • 對于外鍵,使用“屬性名_id”表示外鍵的原始值
  • 轉(zhuǎn)義:like語句中使用了%與,匹配數(shù)據(jù)中的%與,在過濾器中直接寫,例如:filter(title__contains="%")=>where title like '%\%%',表示查找標(biāo)題中包含%的

比較運(yùn)算符

  • exact:表示判等,大小寫敏感;如果沒有寫“?比較運(yùn)算符”,表示判等
filter(isDelete=False)
  • contains:是否包含,大小寫敏感
exclude(btitle__contains='傳')
  • startswith、endswith:以value開頭或結(jié)尾,大小寫敏感
exclude(btitle__endswith='傳')
  • isnull、isnotnull:是否為null
filter(btitle__isnull=False)
  • 在前面加個i表示不區(qū)分大小寫,如iexact、icontains、istarswith、iendswith
  • in:是否包含在范圍內(nèi)
filter(pk__in=[1, 2, 3, 4, 5])
  • gt、gte、lt、lte:大于、大于等于、小于、小于等于
filter(id__gt=3)
  • year、month、day、week_day、hour、minute、second:對日期間類型的屬性進(jìn)行運(yùn)算
filter(bpub_date__year=1980)
filter(bpub_date__gt=date(1980, 12, 31))
  • 跨關(guān)聯(lián)關(guān)系的查詢:處理join查詢
    • 語法:模型類名?<屬性名>?<比較>
    • 注:可以沒有__<比較>部分,表示等于,結(jié)果同inner join
    • 可返向使用,即在關(guān)聯(lián)的兩個模型中都可以使用
filter(heroinfo_ _hcontent_ _contains='八')
  • 查詢的快捷方式:pk,pk表示primary key,默認(rèn)的主鍵是id
filter(pk__lt=6)

聚合函數(shù)

  • 使用aggregate()函數(shù)返回聚合函數(shù)的值
  • 函數(shù):Avg,Count,Max,Min,Sum
from django.db.models import Max
maxDate = list.aggregate(Max('bpub_date'))
  • count的一般用法:
count = list.count()

F對象

  • 可以使用模型的字段A與字段B進(jìn)行比較,如果A寫在了等號的左邊,則B出現(xiàn)在等號的右邊,需要通過F對象構(gòu)造
list.filter(bread__gte=F('bcommet'))
  • django支持對F()對象使用算數(shù)運(yùn)算
list.filter(bread__gte=F('bcommet') * 2)
  • F()對象中還可以寫作“模型類__列名”進(jìn)行關(guān)聯(lián)查詢
list.filter(isDelete=F('heroinfo__isDelete'))
  • 對于date/time字段,可與timedelta()進(jìn)行運(yùn)算
list.filter(bpub_date__lt=F('bpub_date') + timedelta(days=1))

Q對象

  • 過濾器的方法中關(guān)鍵字參數(shù)查詢,會合并為And進(jìn)行
  • 需要進(jìn)行or查詢,使用Q()對象
  • Q對象(django.db.models.Q)用于封裝一組關(guān)鍵字參數(shù),這些關(guān)鍵字參數(shù)與“比較運(yùn)算符”中的相同
from django.db.models import Q
list.filter(Q(pk_ _lt=6))
  • Q對象可以使用&(and)、|(or)操作符組合起來
  • 當(dāng)操作符應(yīng)用在兩個Q對象時,會產(chǎn)生一個新的Q對象
list.filter(pk_ _lt=6).filter(bcommet_ _gt=10)
list.filter(Q(pk_ _lt=6) | Q(bcommet_ _gt=10))
  • 使用~(not)操作符在Q對象前表示取反
list.filter(~Q(pk__lt=6))
  • 可以使用&|~結(jié)合括號進(jìn)行分組,構(gòu)造做生意復(fù)雜的Q對象
  • 過濾器函數(shù)可以傳遞一個或多個Q對象作為位置參數(shù),如果有多個Q對象,這些參數(shù)的邏輯為and
  • 過濾器函數(shù)可以混合使用Q對象和關(guān)鍵字參數(shù),所有參數(shù)都將and在一起,Q對象必須位于關(guān)鍵字參數(shù)的前面

自連接

  • 對于地區(qū)信息,屬于一對多關(guān)系,使用一張表,存儲所有的信息
  • 類似的表結(jié)構(gòu)還應(yīng)用于分類信息,可以實(shí)現(xiàn)無限級分類
  • 新建模型AreaInfo,生成遷移
class AreaInfo(models.Model):atitle = models.CharField(max_length=20)aParent = models.ForeignKey('self', null=True, blank=True)
  • 訪問關(guān)聯(lián)對象
上級對象:area.aParent
下級對象:area.areainfo_set.all()
  • 加入測試數(shù)據(jù)(在workbench中,參見“省市區(qū)mysql.txt”)
  • 在booktest/views.py中定義視圖area
from models import AreaInfo
def area(request):area = AreaInfo.objects.get(pk=130100)return render(request, 'booktest/area.html', {'area': area})
  • 定義模板area.html
<!DOCTYPE html>
<html>
<head><title>地區(qū)</title>
</head>
<body>
當(dāng)前地區(qū):{{area.atitle}}
<hr/>
上級地區(qū):{{area.aParent.atitle}}
<hr/>
下級地區(qū):
<ul>{ %for a in area.areainfo_set.all%}<li>{{a.atitle}}</li>{ %endfor%}
</ul>
</body>
</html>
  • 在booktest/urls.py中配置一個新的urlconf
urlpatterns = [url(r'^area/$', views.area, name='area')
]

總結(jié)

以上是生活随笔為你收集整理的Django 模型查询2.3的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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