Django模型(三)
Django模型(三)
文章目錄
- Django模型(三)
- 一、模型類關系
- 1.關系字段類型
- 2.一對多關系
- 3.多對多關系
- 二、關聯查詢
- 1.通過對象執行關聯查詢
- 2.通過模型類執行關聯查詢
- 三、自關聯
- 四、模型實例方法
- 1.模型類的屬性
- 2.管理器Manager
- 3..修改原始查詢集,重寫all()方法。
- 4.在管理器類中定義創建對象的方法
- 5.元選項
一、模型類關系
1.關系字段類型
關系型數據庫的關系包括三種類型:
- ForeignKey:一對多,將字段定義在多的一端中。
- ManyToManyField:多對多,將字段定義在任意一端中。
- OneToOneField:一對一,將字段定義在任意一端中。
可以維護遞歸的關聯關系,使用’self’指定,詳見"自關聯"。
2.一對多關系
參見booktest應用中的BookInfo類和HeroInfo類。
- 在一對多關系中,一對應的類我們把它叫做一類,多對應的那個類我們把它叫做多類,我們把多類中定義的建立關聯的類屬性叫做關聯屬性
例:查詢id為1的圖書關聯的英雄的信息。
b=BookInfo.objects.get(id=1)b.heroinfo_set.all()通過模型類查詢:
HeroInfo.objects.filter(hbook__id=1)例:查詢id為1的英雄關聯的圖書信息。
h = HeroInfo.objects.get(id=1) h.hbook通過模型類查詢:
BookInfo.objects.filter(heroinfo__id=1)由一類的對象查詢多類的時候:
一類的對象.多類名小寫_set.all() #查詢所用數據
由多類的對象查詢一類的時候:
多類的對象.關聯屬性 #查詢多類的對象對應的一類的對象
由多類的對象查詢一類對象的id時候:
多類的對象. 關聯屬性_id;
3.多對多關系
我們下面設計一個新聞類和新聞類型類,一個新聞類型下可以用很多條新聞,一條新聞也可能歸屬于多種新聞類型。
重新在項目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查詢。
1.通過對象執行關聯查詢
在定義模型類時,可以指定三種關聯關系,最常用的是一對多關系,如本例中的"圖書-英雄"就為一對多關系,接下來進入shell練習關系的查詢。
- 由一到多的訪問語法:
例:
b = BookInfo.objects.get(id=1) b.heroinfo_set.all()- 由多到一的訪問語法:
例:
h = HeroInfo.objects.get(id=1) h.hbook- 訪問一對應的模型類關聯對象的id語法:
例:
h = HeroInfo.objects.get(id=1) h.book_id python manage.py shell例:查詢編號為1的圖書。
book=BookInfo.objects.get(pk=1)例:獲得book圖書的所有英雄。
book.heroinfo_set.all()
例:獲得編號為1的英雄。
例:獲得hero英雄出自的圖書。
hero.hbook2.通過模型類執行關聯查詢
- 由多模型類條件查詢一模型類數據,語法如下:
如果沒有"__運算符"部分,表示等于,結果和sql中的inner join相同。
例:查詢圖書,要求圖書中英雄的描述包含’八’。
list = BookInfo.objects.filter(heroinfo__hcontent__contains='八')- 由一模型類條件查詢多模型類數據,語法如下:
例:查詢書名為“天龍八部”的所有英雄。
list = HeroInfo.objects.filter(hbook__btitle='天龍八部')通過多類的條件查詢一類的數據:
一類名.objects.filter(多類名小寫__多類屬性名__條件名)
通過一類的條件查詢多類的數據:
多類名.objects.filter(關聯屬性__一類屬性名__條件名)
- 調用一個模型類對象的save方法的時候就可以實現對模型類對應數據表的插入和更新。
- 調用一個模型類對象的delete方法的時候就可以實現對模型類對應數據表數據的刪除。
三、自關聯
對于地區信息、分類信息等數據,表結構非常類似,每個表的數據量十分有限,為了充分利用數據表的大量數據存儲功能,可以設計成一張表,內部的關系字段指向本表的主鍵,這就是自關聯的表結構。
- 自關聯是一種特殊的一對多的關系。
- 打開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命令行,導入數據。
- 打開booktest/views.py文件,定義視圖area。
- 打開booktest/urls.py文件,新建一條url。
- 在templates/booktest目錄下,新建area.html文件。
- 在瀏覽器中輸出效果如下圖。
四、模型實例方法
- str():在將對象轉換成字符串時會被調用。
- save():將模型對象保存到數據表中,ORM框架會轉換成對應的insert或update語句。
- delete():將模型對象從數據表中刪除,ORM框架會轉換成對應的delete語句。
1.模型類的屬性
- 屬性objects:管理器,是models.Manager類型的對象,用于與數據庫進行交互。
當沒有為模型類定義管理器時,Django會為每一個模型類生成一個名為objects的管理器,自定義管理器后,Django不再生成默認管理器objects。
- 為模型類BookInfo定義管理器books語法如下:
2.管理器Manager
管理器是Django的模型進行數據庫操作的接口,Django應用的每個模型類都擁有至少一個管理器。Django支持自定義管理器類,繼承自models.Manager。
- 自定義管理器類主要用于兩種情況:
- 1.修改原始查詢集,重寫all()方法
- 2.向管理器類中添加額外的方法,如向數據庫中插入數據。
- BookInfo.objects.all()->objects是一個什么東西呢?
- objects是Django幫我自動生成的管理器對象,通過這個管理器可以實現對數據的查詢。
- objects是models.Manger類的一個對象。自定義管理器之后Django不再幫我們生成默認的objects管理器。
3…修改原始查詢集,重寫all()方法。
- a)打開booktest/models.py文件,定義類BookInfoManager
- b)在模型類BookInfo中定義管理器
4.在管理器類中定義創建對象的方法
- 對模型類對應的數據表進行操作時,推薦將這些操作數據表的方法封裝起來,放到模型管理器類中。
- a)打開booktest/models.py文件,定義方法create。
- b)為模型類BookInfo定義管理器books語法如下
- c)調用語法如下:
5.元選項
在模型類中定義類Meta,用于設置元信息,如使用db_table自定義表的名字。
數據表的默認名稱為:
應用名小寫_模型類名小寫 <app_name>_<model_name>例:
booktest_bookinfo- 元選項:
- 需要在模型類中定義一個元類Meta,在里面定義一個類屬性db_table就可以指定表名。
例:指定BookInfo模型類生成的數據表名為bookinfo。
在BookInfo模型類中添加如下內容,代碼如下:
#定義圖書模型類BookInfo class BookInfo(models.Model):...#定義元選項class Meta:db_table='bookinfo' #指定BookInfo生成的數據表名為bookinfo總結
以上是生活随笔為你收集整理的Django模型(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django模型(二)
- 下一篇: Django视图(一)