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

Thinkgamer_gyt發表於2015-12-03
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"

相關文章