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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django模型(三)

發布時間:2024/4/11 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django模型(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Django模型(三)

文章目錄

  • Django模型(三)
    • 一、模型類關系
      • 1.關系字段類型
      • 2.一對多關系
      • 3.多對多關系
    • 二、關聯查詢
      • 1.通過對象執行關聯查詢
      • 2.通過模型類執行關聯查詢
    • 三、自關聯
    • 四、模型實例方法
      • 1.模型類的屬性
      • 2.管理器Manager
      • 3..修改原始查詢集,重寫all()方法。
      • 4.在管理器類中定義創建對象的方法
      • 5.元選項

一、模型類關系

1.關系字段類型

關系型數據庫的關系包括三種類型:

  • ForeignKey:一對多,將字段定義在多的一端中。
例:圖書類-英雄類 models.ForeignKey() 定義在多的類中。
  • ManyToManyField:多對多,將字段定義在任意一端中。
例:新聞類-新聞類型類 體育新聞 國際新聞 models.ManyToManyField() 定義在哪個類中都可以。
  • OneToOneField:一對一,將字段定義在任意一端中。
    可以維護遞歸的關聯關系,使用’self’指定,詳見"自關聯"。
例:員工基本信息類-員工詳細信息類. 員工工號 models.OneToOneField定義在哪個類中都可以。

2.一對多關系


參見booktest應用中的BookInfo類和HeroInfo類。

#定義圖書模型類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)#邏輯刪除#定義英雄模型類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')#英雄與圖書表的關系為一對多,所以屬性定義在英雄模型類中
  • 在一對多關系中,一對應的類我們把它叫做一類,多對應的那個類我們把它叫做多類,我們把多類中定義的建立關聯的類屬性叫做關聯屬性

例:查詢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練習關系的查詢。

  • 由一到多的訪問語法:
一對應的模型類對象.多對應的模型類名小寫_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圖書的所有英雄。

book.heroinfo_set.all()


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

hero=HeroInfo.objects.get(pk=1)

例:獲得hero英雄出自的圖書。

hero.hbook

2.通過模型類執行關聯查詢

  • 由多模型類條件查詢一模型類數據,語法如下:
關聯模型類名小寫__屬性名__條件運算符=

如果沒有"__運算符"部分,表示等于,結果和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命令行,導入數據。
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', {'area': area})
  • 打開booktest/urls.py文件,新建一條url。
urlpatterns = [...url(r'^area/$', views.area), ]
  • 在templates/booktest目錄下,新建area.html文件。
<html> <head><title>地區</title> </head> <body> 當前地區:{{area.atitle}} <hr/> 上級地區:{{area.aParent.atitle}} <hr/> 下級地區: <ul>{%for a in area.areainfo_set.all%}<li>{{a.atitle}}</li>{%endfor%} </ul> </body> </html> 運行服務器。 python manage.py runserver
  • 在瀏覽器中輸出效果如下圖。

四、模型實例方法

  • str():在將對象轉換成字符串時會被調用。
  • save():將模型對象保存到數據表中,ORM框架會轉換成對應的insert或update語句。
  • delete():將模型對象從數據表中刪除,ORM框架會轉換成對應的delete語句

1.模型類的屬性

  • 屬性objects:管理器,是models.Manager類型的對象,用于與數據庫進行交互。

當沒有為模型類定義管理器時,Django會為每一個模型類生成一個名為objects的管理器,自定義管理器后,Django不再生成默認管理器objects。

  • 為模型類BookInfo定義管理器books語法如下:
class BookInfo(models.Model):...books = models.Manager()

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
#圖書管理器 class BookInfoManager(models.Manager):def all(self):#默認查詢未刪除的圖書信息#調用父類的成員語法為:super().方法名return super().all().filter(isDelete=False)
  • b)在模型類BookInfo中定義管理器
class BookInfo(models.Model):...books = BookInfoManager()

4.在管理器類中定義創建對象的方法

  • 對模型類對應的數據表進行操作時,推薦將這些操作數據表的方法封裝起來,放到模型管理器類中。
  • a)打開booktest/models.py文件,定義方法create。
class BookInfoManager(models.Manager):...#創建模型類,接收參數為屬性賦值def create_book(self, title, pub_date):#創建模型類對象self.model可以獲得模型類book = self.model()book.btitle = titlebook.bpub_date = pub_datebook.bread=0book.bcommet=0book.isDelete = False# 將數據插入進數據表book.save()return book
  • b)為模型類BookInfo定義管理器books語法如下
class BookInfo(models.Model):...books = BookInfoManager()
  • c)調用語法如下:
調用:book=BookInfo.books.create_book("abc",date(1980,1,1))

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模型(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。