03.Django的MTV開發模式詳解和模型關係構建
ORM:物件關係對映
一:MTV開發模式
把資料存取邏輯、業務邏輯和表現邏輯組合在一起的概念有時被稱為軟體架構的 Model-View-Controller(MVC)模式。
在這個模式中,Model 代表資料存取層,View
代表的是系統中選擇顯示什麼和怎麼顯示的部分,Controller
指的是系統中根據使用者輸入並視需要訪問模型,以決定使用哪個檢視的那部分。
Django也遵循這種MVC開發模式,只不過更名為MTV,下邊是django所對應的MVC
-
M ,資料存取部分,由django資料庫層處理,本章要講述的內容。
-
V ,選擇顯示哪些資料要顯示以及怎樣顯示的部分,由檢視和模板處理。
3 -
C ,根據使用者輸入委派檢視的部分,由 Django 框架根據 URLconf 設定,對給定 URL 呼叫適當的 Python 函式。
由於 C 由框架自行處理,而 Django 裡更關注的是模型(Model)、模板(Template)和檢視(Views),Django 也被稱為 MTV 框架 。在 MTV 開發模式中:
-
M 代表模型(Model),即資料存取層。 該層處理與資料相關的所有事務: 如何存取、如何驗證有效性、包含哪些行為以及資料之間的關係等。
-
T 代表模板(Template),即表現層。 該層處理與表現相關的決定: 如何在頁面或其他型別文件中進行顯示。
-
V 代表檢視(View),即業務邏輯層。 該層包含存取模型及調取恰當模板的相關邏輯。 你可以把它看作模型與模板之間的橋樑。
二:一對多的模型構建
定義:注意先後順序
(一個作者對應多本書)
class User(models.Model):
username = models.CharField(max_length=20)
password = models.CharField(max_length=20)
def __unicode__(self): #定義表內容顯示的標題
return self.username
class Meta: #自定義資料表名稱
db_table = "User"
class Blog(models.Model):
#verbose_name='' : 表示後臺中顯示的對應名稱
title = models.CharField(max_length=20, verbose_name='標題') #文章標題
author = models.ForeignKey(User,related_name="blog_author") #外來鍵
#author = models.CharField(max_length=15,verbose_name='作者') #作者
time = models.TimeField(verbose_name='發表時間') #時間
tag = models.CharField(blank=True,max_length=100,verbose_name='文章標籤') #文章標籤 blank=True表示該空格可選填
content = models.TextField(verbose_name='內容') #內容
def __unicode__(self): #後臺中顯示的標題
return self.title
class Meta: #自定義資料表名字
db_table = "Blog"
三:多對多的模型構建
注意先後順序
(一個作者可以編寫多種類別的文章,一個類別的文章可以被多個作者編寫)
class Author(models.Model):
name = models.CharField(max_length=15)
class Blog(models.Model):
#verbose_name='' : 表示後臺中顯示的對應名稱
title = models.CharField(max_length=20, verbose_name='標題') #文章標題
authors = models.ManyToManyField(Author,verbose_name="作者") #外來鍵
#author = models.CharField(max_length=15,verbose_name='作者') #作者
time = models.TimeField(verbose_name='發表時間') #時間
tag = models.CharField(blank=True,max_length=100,verbose_name='文章標籤') #文章標籤 blank=True表示該空格可選填
content = models.TextField(verbose_name='內容') #內容
def __unicode__(self): #後臺中顯示的標題
return self.title
class Meta: #自定義資料表名字
db_table = "Blog"
class Category(models.Model):
category = models.CharField(max_length=20,verbose_name='類別')
blog = models.ForeignKey(Blog,related_name="category_blog") #類別
author = models.ForeignKey(User,related_name="category_author") #外來鍵
def __unicode__(self):
return self.category
class Meta:
db_table = "Category"
四:新增模組的字串表現
class Author(models.Model):
name = models.CharField(max_length=15)
插入和更新資料
a = Author(name='aaa')
a.save()
選擇物件
Author.objects.all()
資料過濾
Author.objects.filter(name='Apress',age=12) #以字典形式傳值
獲取單個物件
Author.objects.get(name='Apress')
這樣,就返回了單個物件,而不是列表(更準確的說,QuerySet)。 所以,如果結果是多個物件,會導致丟擲異常
如果查詢沒有返回結果也會丟擲異常
資料排序
Author.order_by("name")
連鎖查詢
Author.objects.filter(name="sss").order_by("-name")
限制返回的資料
Author.order_by("name")[0]
更新多個物件
Author.objects.filter(id=52).update(name='Apress Publishing')
刪除物件
Author.objects.filter(name="sss").delete()
class Book(models.Model):這裡程式碼的關鍵是
title = models.CharField(max_length=100)
genre = models.CharField(max_length=100)
num_pages = models.IntergerField()
authors = models.ManyToManyField(Author)
def __unicode__(self):
return self.title
class Meta:
abstract = True
class SmithBook(Book):
authors = models.ManyToManyField(Author, limit_choices_to = {
'name_endswith': 'Smith'
})
abstract
= True
設定, 指明瞭Book是一個抽象基礎類
沒有了Meta abstract 選項,
在一個空資料庫和這個 models.py
檔案上執行 manage.py
syncdb
會建立三張表 Author, Book, SmithBook
而抽象基礎類的情況下,只建立了 Author, SmithBook 兩張表。
六:Meta巢狀類
Meta類處理的是模型的各種後設資料的使用和顯示:
- 比如在一個物件對多個物件是,它的名字應該怎麼顯示;
- 查詢資料表示預設的排序順序是什麼?
- 資料表的名字是什麼
- 多變數唯一性 (這種限制沒有辦法在每個單獨的變數宣告上定義)
class Person(models.Model):
first = models.CharField(max_length=100)
last = models.CharField(max_length=100)
middle = models.CharField(max_length=100, blank=True)
class Meta:
ordering = ['last', 'first', 'middle']
unique_together = ['first', 'last', 'middle']
#Django預設的複數形式是加 s,這裡不適用
verbose_name_plural = "people"
相關文章
- Django MTV模式詳解Django模式
- ER模型轉關係模式模型模式
- 詳解js原型,建構函式以及class之間的原型關係JS原型函式
- C指標和陣列的關係詳解指標陣列
- 在 Laravel 中使用子查詢來構建動態模型關係Laravel模型
- 三論SNS與微部落格:構建淺關係時代人際關係演變的立體模型薦模型
- 關係模型模型
- 設計模式存在哪些關聯關係,六種關係傻傻分不清--- UML圖示詳解設計模式
- 類圖的6大關係詳解
- jQuery外掛開發模式詳解jQuery模式
- 企業的公共關係技巧和建議
- 工具和敏捷軟體開發之間的關係敏捷
- MTV和MVC的區別MVC
- Java開發中的23種設計模式詳解之二:7種結構型模式Java設計模式
- Laravel 中的多對多關係詳解Laravel
- UML類圖與類的關係詳解
- 類之間的6種關係詳解
- 建構函式詳解函式
- 非關係型資料庫(NOSQL)和關係型資料庫(SQL)區別詳解資料庫SQL
- hibernate(六) cascade(級聯)和inverse關係詳解
- 詳細介紹php和apache的關係和作用PHPApache
- 【學習】= 概念 + 關係 + 關係發生的過程和條件
- 敏捷開發領域裡的 Epic 以及和 User Story 的關聯關係敏捷
- odoo 開發入門教程系列-模型之間的關係(Relations Between Models)Odoo模型
- 物件導向程式設計程式碼詳解(依賴關係,關聯關係,組合關係)物件程式設計
- Java開發中的事件驅動模型例項詳解Java事件模型
- Android開發中的MVP架構詳解AndroidMVP架構
- Spring Boot的前世今生以及它和Spring Cloud的關係詳解。Spring BootCloud
- Java建構函式詳解Java函式
- 詳解 JavaScript 建構函式和 "new" 操作符JavaScript函式
- 探索 DevOps 和質量內建的相互關係dev
- SEO和品牌建設有什麼關係?
- 平行鏈和主鏈開發是什麼關係?
- C++程式設計開發和指標的關係C++程式設計指標
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- [關係圖譜] 二.Gephi匯入共線矩陣構建作者關係圖譜矩陣
- Laravel 之多對多的關係模型Laravel模型
- Laravel Eloquent 的關係模型聯動Laravel模型