Django模型關聯

2021-09-25 05:59:44 字數 4096 閱讀 7056

關係字段型別

關係型資料庫的關係包括三種型別:

一對多關係

參見booktest應用中的bookinfo類和heroinfo類。

#定義圖書模型類bookinfo

class bookinfo(models.model):

btitle = models.charfield(max_length=20)#圖書名稱

bpub_date = models.datefield()#發布日期

bread = models.integerfield(default=0)#閱讀量

isdelete = models.booleanfield(default=false)#邏輯刪除

#定義英雄模型類heroinfo

class heroinfo(models.model):

hname = models.charfield(max_length=20)#英雄姓名

hgender = models.booleanfield(default=true)#英雄性別

isdelete = models.booleanfield(default=false)#邏輯刪除

hcomment = models.charfield(max_length=200)#英雄描述資訊

hbook = models.foreignkey('bookinfo')#英雄與圖書表的關係為一對多,所以屬性定義在英雄模型類中

多對多關係

我們下面設計乙個新聞類和新聞型別類,乙個新聞型別下可以用很多條新聞,一條新聞也可能歸屬於多種新聞型別。

重新在專案test2下新建乙個應用newstest,註冊應用之後,編輯newstest/models.py檔案設計模型類。

class typeinfo(models.model):

tname = models.charfield(max_length=20) #新聞類別

class newsinfo(models.model):

ntitle = models.charfield(max_length=60) #新聞標題

ncontent = models.textfield() #新聞內容

npub_date = models.datetimefield(auto_now_add=true) #新聞發布時間

ntype = models.manytomanyfield('typeinfo') #通過manytomanyfield建立typeinfo類和newsinfo類之間多對多的關係

django中也能實現類似於join查詢。

通過物件執行關聯查詢

在定義模型類時,可以指定三種關聯關係,最常用的是一對多關係,如本例中的"圖書-英雄"就為一對多關係,接下來進入shell練習關係的查詢。

由一到多的訪問語法:

一對應的模型類物件.多對應的模型類名小寫_set

例:b = bookinfo.objects.get(id=1)

b.heroinfo_set.all()

由多到一的訪問語法:

多對應的模型類物件.多對應的模型類中的關係類屬性名

例:h = heroinfo.objects.get(id=1)

h.hbook

訪問一對應的模型類關聯物件的id語法:

多對應的模型類物件.關聯類屬性_id

例:h = heroinfo.objects.get(id=1)

h.book_id

python manage.py shell
例:查詢編號為1的圖書。

book=bookinfo.objects.get(pk=1)
例:獲得book圖書的所有英雄。

例:獲得編號為1的英雄。

hero=heroinfo.objects.get(pk=1)
例:獲得hero英雄出自的圖書。

通過模型類執行關聯查詢

由多模型類條件查詢一模型類資料:

語法如下:

關聯模型類名小寫__屬性名__條件運算子=值
如果沒有"__運算子"部分,表示等於,結果和sql中的inner join相同。

例:查詢圖書,要求圖書中英雄的描述包含'八'。

list = bookinfo.objects.filter(heroinfo__hcontent__contains='八')
由一模型類條件查詢多模型類資料: 語法如下:

一模型類關聯屬性名__一模型類屬性名__條件運算子=值
例:查詢書名為「天龍八部」的所有英雄。

list = heroinfo.objects.filter(hbook__btitle='天龍八部')
對於地區資訊、分類資訊等資料,表結構非常類似,每個表的資料量十分有限,為了充分利用資料表的大量資料儲存功能,可以設計成一張表,內部的關係字段指向本表的主鍵,這就是自關聯的表結構。

開啟booktest/models.py檔案,定義areainfo類。

說明:關係屬性使用self指向本類,要求null和blank允許為空,因為一級資料是沒有父級的。

#定義地區模型類,儲存省、市、區縣資訊

class areainfo(models.model):

atitle=models.charfield(max_length=30)#名稱

aparent=models.foreignkey('self',null=true,blank=true)#關係

遷移。

開啟mysql命令列,匯入資料。

source areas.sql
開啟booktest/views.py檔案,定義檢視area。

from booktest.models import areainfo

...#查詢廣州市的資訊

def area(request):

area = areainfo.objects.get(pk=440100)

return render(request, 'booktest/area.html', )

開啟booktest/urls.py檔案,新建一條url。

urlpatterns = [

...url(r'^area/$', views.area),

]

在templates/booktest目錄下,新建area.html檔案。

當前地區:}

上級地區:}

下級地區:

執行伺服器。

python manage.py runserver
在瀏覽器中輸出效果如下圖。

Django模型關聯

1對1,1對多,多對多 1對1 onetoonefield 主鍵和外來鍵是一對一的關係,在關聯表中,只能關聯乙個主表的id拓展表找主表。建立模型 class student models.model stu name models.charfield max length 10 stu models...

django 模型 關聯關係

stu student.objects.create name computer.objects.create name 電腦 stu stu school school.objects.create name stu student.objects.create name school schoo...

Django1 6中models模型關聯的方法整理

foreignkey是個多對一 many to one 關係。引用下官方文件的例子 from django.db import models class topping models.model pass class pizza models.model toppings models.foreig...