1. 關聯 1.1 模型類關係 關係型資料庫的關係包括三種類型: ForeignKey:一對多,將欄位定義在多的一端中。 ManyToManyField:多對多,將欄位定義在任意一端中。 OneToOneField:一對一,將欄位定義在任意一端中。 1.1.1 一對多關係 #定義圖書模型類BookI ...
1. 關聯
1.1 模型類關係
關係型資料庫的關係包括三種類型:
- ForeignKey:一對多,將欄位定義在多的一端中。
- ManyToManyField:多對多,將欄位定義在任意一端中。
- OneToOneField:一對一,將欄位定義在任意一端中。
1.1.1 一對多關係
#定義圖書模型類BookInfo class BookInfo(models.Model): btitle = models.CharField(max_length=20)#圖書名稱 bpub_date = models.DateField()#發佈日期 bread = models.IntegerField(default=0)#閱讀量 bcomment = models.IntegerField(default=0)#評論量 isDelete = models.BooleanField(default=False)#邏輯刪除 #定義角色模型類RoleInfo class RoleInfo(models.Model): rname = models.CharField(max_length=20)#角色姓名 rgender = models.BooleanField(default=True)#角色性別 isDelete = models.BooleanField(default=False)#邏輯刪除 rcomment = models.CharField(max_len角色與圖書表的關係為一對多,所以屬性定義在角色模型類中
1.1.2 多對多關係
我們下麵設計一個新聞類和新聞類型類,一個新聞類型下可以用很多條新聞,一條新聞也可能歸屬於多種新聞類型。
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類之間多對多的關係
1.2 關聯查詢
Django中也能實現類似於join查詢。
1.2.1 通過對象執行關聯查詢
在定義模型類時,可以指定三種關聯關係,最常用的是一對多關係,例如“圖書-角色”就是一對多關係。
#一對應的模型類對象.多對應的模型類名小寫_set b = BookInfo.objects.get(id=1) b.heroinfo_set.all()
由多到一的訪問語法:
#多對應的模型類對象.多對應的模型類中的關係類屬性名 r = RoleInfo.objects.get(id=1) r.rbook
訪問一對應的模型類關聯對象的id語法:
#多對應的模型類對象.關聯類屬性_id r = RoleInfo.objects.get(id=1) r.book_id
例:查詢編號為1的圖書。
book=BookInfo.objects.get(pk=1)
例:獲得book圖書的所有角色。
book.roleinfo_set.all()
例:獲得編號為1的角色。
role=RoleInfo.objects.get(pk=1)
例:獲得role角色出自的圖書。
role.rbook
1.2.2 通過模型類執行關聯查詢
由多模型類條件查詢一模型類數據:
語法如下:
關聯模型類名小寫__屬性名__條件運算符=值
如果沒有"__運算符"部分,表示等於,結果和sql中的inner join相同。
例:查詢圖書,要求圖書中英雄的描述包含'韓'。
list = BookInfo.objects.filter(heroinfo__hcontent__contains='韓')
由一模型類條件查詢多模型類數據:
語法如下:
一模型類關聯屬性名__一模型類屬性名__條件運算符=值
例:查詢書名為“鬥羅大陸”的所有英雄。
list = HeroInfo.objects.filter(hbook__btitle='鬥羅大陸')
1.3 自關聯
對於地區信息、分類信息等數據,表結構非常類似,每個表的數據量十分有限,為了充分利用數據表的大量數據存儲功能,可以設計成一張表,內部的關係欄位指向本表的主鍵,這就是自關聯的表結構。
打開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)#關係
遷移。
python manage.py makemigrations
python manage.py migrate
打開mysql命令行,導入數據。
INSERT INTO booktest_areainfo VALUES ('440000', '廣東省', NULL); INSERT INTO booktest_areainfo VALUES ('440100', '廣州市', '440000'); INSERT INTO booktest_areainfo VALUES ('440103', '荔灣區', '440100'); INSERT INTO booktest_areainfo VALUES ('440104', '越秀區', '440100'); INSERT INTO booktest_areainfo VALUES ('440105', '海珠區', '440100'); INSERT INTO booktest_areainfo VALUES ('440106', '天河區', '440100'); INSERT INTO booktest_areainfo VALUES ('440111', '白雲區', '440100'); INSERT INTO booktest_areainfo VALUES ('440112', '黃埔區', '440100'); INSERT INTO booktest_areainfo VALUES ('440113', '番禺區', '440100'); INSERT INTO booktest_areainfo VALUES ('440114', '花都區', '440100'); INSERT INTO booktest_areainfo VALUES ('440115', '南沙區', '440100'); INSERT INTO booktest_areainfo VALUES ('440116', '蘿崗區', '440100'); INSERT INTO booktest_areainfo VALUES ('440183', '增城市', '440100'); INSERT INTO booktest_areainfo VALUES ('440184', '從化市', '440100'); INSERT INTO booktest_areainfo VALUES ('440200', '韶關市', '440000'); INSERT INTO booktest_areainfo VALUES ('440203', '武江區', '440200'); INSERT INTO booktest_areainfo VALUES ('440204', '湞江區', '440200'); INSERT INTO booktest_areainfo VALUES ('440205', '曲江區', '440200'); INSERT INTO booktest_areainfo VALUES ('440222', '始興縣', '440200'); INSERT INTO booktest_areainfo VALUES ('440224', '仁化縣', '440200'); INSERT INTO booktest_areainfo VALUES ('440229', '翁源縣', '440200'); INSERT INTO booktest_areainfo VALUES ('440232', '乳源瑤族自治縣', '440200'); INSERT INTO booktest_areainfo VALUES ('440233', '新豐縣', '440200'); INSERT INTO booktest_areainfo VALUES ('440281', '樂昌市', '440200'); INSERT INTO booktest_areainfo VALUES ('440282', '南雄市', '440200'); INSERT INTO booktest_areainfo VALUES ('440300', '深圳市', '440000'); INSERT INTO booktest_areainfo VALUES ('440303', '羅湖區', '440300'); INSERT INTO booktest_areainfo VALUES ('440304', '福田區', '440300'); INSERT INTO booktest_areainfo VALUES ('440305', '南山區', '440300'); INSERT INTO booktest_areainfo VALUES ('440306', '寶安區', '440300'); INSERT INTO booktest_areainfo VALUES ('440307', '龍崗區', '440300'); INSERT INTO booktest_areainfo VALUES ('440308', '鹽田區', '440300'); INSERT INTO booktest_areainfo VALUES ('440400', '珠海市', '440000'); INSERT INTO booktest_areainfo VALUES ('440402', '香洲區', '440400'); INSERT INTO booktest_areainfo VALUES ('440403', '斗門區', '440400'); INSERT INTO booktest_areainfo VALUES ('440404', '金灣區', '440400'); INSERT INTO booktest_areainfo VALUES ('440500', '汕頭市', '440000'); INSERT INTO booktest_areainfo VALUES ('440507', '龍湖區', '440500'); INSERT INTO booktest_areainfo VALUES ('440511', '金平區', '440500'); INSERT INTO booktest_areainfo VALUES ('440512', '濠江區', '440500'); INSERT INTO booktest_areainfo VALUES ('440513', '潮陽區', '440500'); INSERT INTO booktest_areainfo VALUES ('440514', '潮南區', '440500'); INSERT INTO booktest_areainfo VALUES ('440515', '澄海區', '440500'); INSERT INTO booktest_areainfo VALUES ('440523', '南澳縣', '440500'); INSERT INTO booktest_areainfo VALUES ('440600', '佛山市', '440000'); INSERT INTO booktest_areainfo VALUES ('440604', '禪城區', '440600'); INSERT INTO booktest_areainfo VALUES ('440605', '南海區', '440600'); INSERT INTO booktest_areainfo VALUES ('440606', '順德區', '440600'); INSERT INTO booktest_areainfo VALUES ('440607', '三水區', '440600'); INSERT INTO booktest_areainfo VALUES ('440608', '高明區', '440600'); INSERT INTO booktest_areainfo VALUES ('440700', '江門市', '440000'); INSERT INTO booktest_areainfo VALUES ('440703', '蓬江區', '440700'); INSERT INTO booktest_areainfo VALUES ('440704', '江海區', '440700'); INSERT INTO booktest_areainfo VALUES ('440705', '新會區', '440700'); INSERT INTO booktest_areainfo VALUES ('440781', '台山市', '440700'); INSERT INTO booktest_areainfo VALUES ('440783', '開平市', '440700'); INSERT INTO booktest_areainfo VALUES ('440784', '鶴山市', '440700'); INSERT INTO booktest_areainfo VALUES ('440785', '恩平市', '440700'); INSERT INTO booktest_areainfo VALUES ('440800', '湛江市', '440000'); INSERT INTO booktest_areainfo VALUES ('440802', '赤坎區', '440800'); INSERT INTO booktest_areainfo VALUES ('440803', '霞山區', '440800'); INSERT INTO booktest_areainfo VALUES ('440804', '坡頭區', '440800'); INSERT INTO booktest_areainfo VALUES ('440811', '麻章區', '440800'); INSERT INTO booktest_areainfo VALUES ('440823', '遂溪縣', '440800'); INSERT INTO booktest_areainfo VALUES ('440825', '徐聞縣', '440800'); INSERT INTO booktest_areainfo VALUES ('440881', '廉江市', '440800'); INSERT INTO booktest_areainfo VALUES ('440882', '雷州市', '440800'); INSERT INTO booktest_areainfo VALUES ('440883', '吳川市', '440800'); INSERT INTO booktest_areainfo VALUES ('440900', '茂名市', '440000'); INSERT INTO booktest_areainfo VALUES ('440902', '茂南區', '440900'); INSERT INTO booktest_areainfo VALUES ('440903', '茂港區', '440900'); INSERT INTO booktest_areainfo VALUES ('440923', '電白縣', '440900'); INSERT INTO booktest_areainfo VALUES ('440981', '高州市', '440900'); INSERT INTO booktest_areainfo VALUES ('440982', '化州市', '440900'); INSERT INTO booktest_areainfo VALUES ('440983', '信宜市', '440900'); INSERT INTO booktest_areainfo VALUES ('441200', '肇慶市', '440000'); INSERT INTO booktest_areainfo VALUES ('441202', '端州區', '441200'); INSERT INTO booktest_areainfo VALUES ('441203', '鼎湖區', '441200'); INSERT INTO booktest_areainfo VALUES ('441223', '廣寧縣', '441200'); INSERT INTO booktest_areainfo VALUES ('441224', '懷集縣', '441200'); INSERT INTO booktest_areainfo VALUES ('441225', '封開縣', '441200'); INSERT INTO booktest_areainfo VALUES ('441226', '德慶縣', '441200'); INSERT INTO booktest_areainfo VALUES ('441283', '高要市', '441200'); INSERT INTO booktest_areainfo VALUES ('441284', '四會市', '441200'); INSERT INTO booktest_areainfo VALUES ('441300', '惠州市', '440000'); INSERT INTO booktest_areainfo VALUES ('441302', '惠城區', '441300'); INSERT INTO booktest_areainfo VALUES ('441303', '惠陽區', '441300'); INSERT INTO booktest_areainfo VALUES ('441322', '博羅縣', '441300'); INSERT INTO booktest_areainfo VALUES ('441323', '惠東縣', '441300'); INSERT INTO booktest_areainfo VALUES ('441324', '龍門縣', '441300'); INSERT INTO booktest_areainfo VALUES ('441400', '梅州市', '440000'); INSERT INTO booktest_areainfo VALUES ('441402', '梅江區', '441400'); INSERT INTO booktest_areainfo VALUES ('441421', '梅縣', '441400'); INSERT INTO booktest_areainfo VALUES ('441422', '大埔縣', '441400'); INSERT INTO booktest_areainfo VALUES ('441423', '豐順縣', '441400'); INSERT INTO booktest_areainfo VALUES ('441424', '五華縣', '441400'); INSERT INTO booktest_areainfo VALUES ('441426', '平遠縣', '441400'); INSERT INTO booktest_areainfo VALUES ('441427', '蕉嶺縣', '441400'); INSERT INTO booktest_areainfo VALUES ('441481', '興寧市', '441400'); INSERT INTO booktest_areainfo VALUES ('441500', '汕尾市', '440000'); INSERT INTO booktest_areainfo VALUES ('441502', '城區', '441500'); INSERT INTO booktest_areainfo VALUES ('441521', '海豐縣', '441500'); INSERT INTO booktest_areainfo VALUES ('441523', '陸河縣', '441500'); INSERT INTO booktest_areainfo VALUES ('441581', '陸豐市', '441500');