03.Django的MTV開發模式詳解和模型關係構建

ORM:對象關係映射數據庫

一:MTV開發模式
把數據存取邏輯、業務邏輯和表現邏輯組合在一塊兒的概念有時被稱爲軟件架構的 Model-View-Controller(MVC)模式。 在這個模式中,Model 表明數據存取層,View 表明的是系統中選擇顯示什麼和怎麼顯示的部分,Controller 指的是系統中根據用戶輸入並視須要訪問模型,以決定使用哪一個視圖的那部分。django


Django也遵循這種MVC開發模式,只不過改名爲MTV,下邊是django所對應的MVC
M ,數據存取部分,由django數據庫層處理,本章要講述的內容。架構

V ,選擇顯示哪些數據要顯示以及怎樣顯示的部分,由視圖和模板處理。框架

3
C ,根據用戶輸入委派視圖的部分,由 Django 框架根據 URLconf 設置,對給定 URL 調用適當的 Python 函數。函數

因爲 C 由框架自行處理,而 Django 裏更關注的是模型(Model)、模板(Template)和視圖(Views),Django 也被稱爲 MTV 框架 。在 MTV 開發模式中:.net

M 表明模型(Model),即數據存取層。 該層處理與數據相關的全部事務: 如何存取、如何驗證有效性、包含哪些行爲以及數據之間的關係等。code

T 表明模板(Template),即表現層。 該層處理與表現相關的決定: 如何在頁面或其餘類型文檔中進行顯示。對象

V 表明視圖(View),即業務邏輯層。 該層包含存取模型及調取恰當模板的相關邏輯。 你能夠把它看做模型與模板之間的橋樑。blog

 

二:一對多的模型構建排序


    定義:注意前後順序
(一個做者對應多本書)
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,這裏不適用

相關文章
相關標籤/搜索