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"
相關文章
- 詳解js原型,建構函式以及class之間的原型關係JS原型函式
- C指標和陣列的關係詳解指標陣列
- 在 Laravel 中使用子查詢來構建動態模型關係Laravel模型
- 設計模式存在哪些關聯關係,六種關係傻傻分不清--- UML圖示詳解設計模式
- 類圖的6大關係詳解
- Spring Boot的前世今生以及它和Spring Cloud的關係詳解。Spring BootCloud
- MTV和MVC的區別MVC
- Laravel 中的多對多關係詳解Laravel
- 類之間的6種關係詳解
- 非關係型資料庫(NOSQL)和關係型資料庫(SQL)區別詳解資料庫SQL
- SAP Commerce Cloud 裡的 User 模型和 Restriction 的關係Cloud模型REST
- 詳細介紹php和apache的關係和作用PHPApache
- 探索 DevOps 和質量內建的相互關係dev
- 建構函式詳解函式
- 物件導向程式設計程式碼詳解(依賴關係,關聯關係,組合關係)物件程式設計
- odoo 開發入門教程系列-模型之間的關係(Relations Between Models)Odoo模型
- C++程式設計開發和指標的關係C++程式設計指標
- 敏捷開發領域裡的 Epic 以及和 User Story 的關聯關係敏捷
- 【轉】QPS和併發數的關係
- SEO和品牌建設有什麼關係?
- 【設計模式】第九篇:組合模式解決層級關係結構問題設計模式
- 詳解 JavaScript 建構函式和 "new" 操作符JavaScript函式
- Java建構函式詳解Java函式
- [關係圖譜] 二.Gephi匯入共線矩陣構建作者關係圖譜矩陣
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- 微服務架構的理解以及和 RPC 的關係微服務架構RPC
- 前端建構函式、原型、例項物件之間的關係前端函式原型物件
- Laravel 之多對多的關係模型Laravel模型
- 平行鏈和主鏈開發是什麼關係?
- Java開發中的事件驅動模型例項詳解Java事件模型
- vue-router的hash模式和history模式詳解Vue模式
- 知識圖譜構建之實體關係挖掘
- Golang建立建構函式的方法詳解Golang函式
- CPU、記憶體、快取的關係詳細解釋!記憶體快取
- openfile解讀以及和latch的一點關係
- RabbitMQ架構詳解(7大架構原理模型圖解)MQ架構模型圖解
- Django+Vue構建前後端分離開發模式DjangoVue後端模式
- 低程式碼開發:企業應用構建新模式模式
- [關係圖譜] 一.Gephi通過共現矩陣構建知網作者關係圖譜矩陣