-
字段查詢
- 實現(xiàn)sql中where的功能,調(diào)用過濾器filter()、exclude()、get(),下面以filter()為例
- 通過“屬性名_id”表示外鍵對應(yīng)對象的id值
- 語法如下
- 說明:屬性名稱和比較運算符間使用兩個下劃線,所以屬性名不能包括多個下劃線
- 屬性名稱__比較運算符=值
-
條件運算符
-
exact:表示判等
- 例:查詢編號為1的圖書
list=BookInfo.books.filter(id__exact=1) 可簡寫為: list=BookInfo.books.filter(id=1)
- 例:查詢編號為1的圖書
contains:是否包含
說明:如果要包含%無需轉(zhuǎn)義,直接寫即可
-
例:查詢書名包含‘傳’的圖書
- list = BookInfo.books.filter(btitle__contains='傳')
startswith、endswith:以指定值開頭或結(jié)尾
-
例:查詢書名以‘部’結(jié)尾的圖書
- list = BookInfo.books.filter(btitle__endswith='部')
-
isnull:是否為null
- 例:查詢書名不為空的圖書
list = BookInfo.books.filter(btitle__isnull=False)
- 例:查詢書名不為空的圖書
以上運算符都區(qū)分大小寫,在這些運算符前加上i表示不區(qū)分大小寫,如iexact、icontains、istartswith、iendswith
-
in:是否包含在范圍內(nèi)
- 例:查詢編號為1或3或5的圖書
list = BookInfo.books.filter(pk__in=[1, 3, 5])
- 例:查詢編號為1或3或5的圖書
-
gt、gte、lt、lte:大于、大于等于、小于、小于等于
- 例:查詢編號大于3的圖書
list = BookInfo.books.filter(id__gt=3)
- 例:查詢編號大于3的圖書
不等于使用等于的運算符,使用exclude()過濾器
例:查詢編號不等于3的圖書
list = BookInfo.books.exclude(id=3)不等查詢
year、month、day、week_day、hour、minute、second:對日期時間類型的屬性進行運算
例:查詢1980年發(fā)表的圖書
list = BookInfo.books.filter(bpub_date__year=1980)-
日期查詢1
例:查詢1980年1月1日后發(fā)表的圖書
list = BookInfo.books.filter(bpub_date__gt=date(1990, 1, 1))日期查詢2
-
-
關(guān)聯(lián)查詢(外連接類似)
-
Django中也能實現(xiàn)類似于join查詢
語法如下關(guān)聯(lián)模型類名小寫屬性名運算符=值
-
如果沒有沒有“__運算符”部分,表示等于,結(jié)果和sql中的inner join相同
- 例:查詢圖書,要求圖書中英雄的描述包含‘八’
list = BookInfo.books.filter(heroinfo__hcontent__contains='八')- 例:查詢書名為"天龍八部"的所有英雄
list = HeroInfo.objects.filter(hbook__btitle='天龍八部')
-
F對象
之前的查詢都是對象的屬性與常量值比較,兩個屬性怎么比較呢? 答:使用F對象,被定義在django.db.models中
語法如下- F(屬性名)
例:查詢閱讀量大于等于評論量的圖書
from django.db.models import F ... list = BookInfo.books.filter(bread__gte=F('bcommet'))- 可以在F()對象上使用算數(shù)運算
例:查詢閱讀量大于2倍評論量的圖書
list = BookInfo.books.filter(bread__gt=F('bcommet') * 2) - F(屬性名)
-
Q對象
- 多個過濾器逐個調(diào)用表示邏輯與關(guān)系,同sql語句中where部分的and關(guān)鍵字
- 例:查詢閱讀量大于20,并且編號小于3的圖書
list=BookInfo.books.filter(bread__gt=20,id__lt=3)
或
list=BookInfo.books.filter(bread__gt=20).filter(id__lt=3)
-
3. 如果需要實現(xiàn)邏輯或or的查詢,需要使用Q()對象結(jié)合|運算符
4. **Q對象被義在django.db.models中**
1. 語法如下
Q(屬性名__運算符=值)
1. 例:查詢閱讀量大于20的圖書,改寫為Q對象如下
from django.db.models import Q
...
list = BookInfo.books.filter(Q(bread__gt=20))
2. Q對象可以使用&、|連接,**&表示邏輯與,|表示邏輯或**
1. 例:查詢閱讀量大于20,或編號小于3的圖書,只能使用Q對象實現(xiàn)
list = BookInfo.books.filter(Q(bread__gt=20) | Q(pk__lt=3))
5. Q對象前可以使用~操作符,表示非not
1. 例:查詢編號不等于3的圖書
list = BookInfo.books.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.books.aggregate(Sum('bread')) 在運行服務(wù)器命令行可以看到list的字典結(jié)果
-
使用count時一般不使用aggregate()過濾器
- 例:查詢圖書總數(shù)
list = BookInfo.books.count()
- 例:查詢圖書總數(shù)
在運行服務(wù)器命令行可以看到list的結(jié)果
-
-
關(guān)聯(lián)查詢的練習(xí)
-
關(guān)聯(lián)的查詢
在定義模型類時,可以指定三種關(guān)聯(lián)關(guān)系,最常用的是一對多關(guān)系,如本例中的“圖書-英雄”就為一對多關(guān)系,接下來進入shell練習(xí)關(guān)系的查詢python manage.py shell
查詢編號為1的圖書
book=BookInfo.books.get(pk=1)獲得book圖書的所有英雄
book.heroinfo_set.all()獲得編號為1的英雄
hero=HeroInfo.objects.get(pk=1)獲得hero英雄出自的圖書
hero.hbook
-
自關(guān)聯(lián)
對于地區(qū)信息、分類信息等數(shù)據(jù),表結(jié)構(gòu)非常類似,每個表的數(shù)據(jù)量十分有限,為了充分利用數(shù)據(jù)表的大量數(shù)據(jù)存儲功能,可以可以設(shè)計成一張表,內(nèi)部的關(guān)系字段指向本表的主鍵,這就是自關(guān)聯(lián)的表結(jié)構(gòu)
打開booktest/models.py文件,定義AreaInfo類
說明:關(guān)系屬性使用self指向本類,要求null和blank允許為空,因為一級數(shù)據(jù)是沒有父級的
定義地區(qū)模型類,存儲省、市、區(qū)縣信息
class AreaInfo(models.Model): atitle=models.CharField(max_length=30)#名稱 aParent=models.ForeignKey('self',null=True,blank=True)#關(guān)系-
遷移
- python manage.py makemigrations
python manage.py migrate
- python manage.py makemigrations
-
打開mysql命令行,導(dǎo)入數(shù)據(jù)
- source areas.sql
-
打開booktest/views.py文件,定義視圖area
from models import AreaInfo ... #查詢廣州市的信息 def area(request): area = AreaInfo.objects.get(pk=440100) return render(request, 'booktest/area.html', {'area': area}) -
打開booktest/urls.py文件,新建一條url
urlpatterns = [ ... url(r'^area/$', views.area), ] -
在templates/booktest目錄下,新建area.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>- 運行服務(wù)器
python manage.py runserver
- 運行服務(wù)器
-
-
總結(jié)
- 修改配置文件使用mysql數(shù)據(jù)庫
- 屬性類型及選項
- 自定義管理器及用途
- 查詢集和條件查詢
- 關(guān)聯(lián)