close

 2017.08.24 

資料來源: (1)https://djangobook.com/the-django-book/

      在上二篇文章中我們己經使用了URLS、Templates、 Views,這篇文章我們將介紹Models設定及Database的使用,並且整合之前的元件,我們仍舊要從到我們的MTV架構開始談起,為什麼呢,我個人覺得這個圖及架構就是Django的設計精神,有些設定及設計流程要思考這個圖就能理解一大半了。從圖中可以看到Models介於Views及資料庫之間,如果我們不要Models 層將資料庫設定及資料全放在Views是否可以,聰明的你一定猜到了,從下圖的資料訊流顯示那一定是可以的,是否有這種的設計方式呢,當然是有像傳統的網頁設計就是使用這樣的架構設計,他們不用管什麼三層式架構,資料層,企業邏輯層,資料呈現層全部混在一起全部放在一個檔案內,這種方式當然也是可以的。而這種方式目前在市場上也是佔有一席之地的。為什麼呢? 因為全部程式使用的元件比較少,整個架構及流程設計會比較簡單。但後續程式的維護修改會比較有問題。那就是當換資料庫時全部有關係到資料庫設定的Views就要全部都翻過一次。

(資料來源:http://blog.easylearning.guru/implementing-mtv-model-in-python-django/)

 回到Models的問題,我可以先破題的說Models 記錄的內容就是tables 及tables之間關連性的內容。記住這字話後面的內容設定,程式設計將會變的簡單。

資料庫設定


首先我們先開啓一個資料庫,以供後面的Models及程式用
打開 settings.py檔案,預設資料庫是sqlite
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

我們使用預設資料庫,所以不做任何異動,你可以依你的資料庫類型改變設定。另外在settings.py內尋找
INSTALLED_APPS ,把你的app name 加入,讓Django知道那些是我們會有到的app。
例如我想要設計一個KTV 點歌的web app,所以我加入了kaok 到settings.py內。如果其他預設的app 不需要可以加上#

 

INSTALLED_APPS = (
    #'django.contrib.admin',
    #'django.contrib.auth',
    #'django.contrib.contenttypes',
    #'django.contrib.sessions',
    #'django.contrib.messages',
    #'django.contrib.staticfiles',
    'kaok',
)


定義Django Models內容

from django.db import models

class kaok(models.Model):
    song_no = models.CharField(max_length=6)
    songer = models.CharField(max_length=30)
    song_name = models.CharField(max_length=60)
    song_lang = models.CharField(max_length=20)
    song_kind = models.CharField(max_length=20)
    song_words = models.CharField(max_length=3)

我們的例子比較簡單,只有一個Model 和 數個文字型態的欄位,在這個地方你可以把Model物件=table。
(1)Model 物件名字就是table名字。
(2)定義欄位名、欄位型態、最大長度。(其他欄位型態我們例子没用到,請看下面比較複雜的範例)
(3)定義Models之間的關連性(我們例子没用到,請看下面比較複雜的範例)

from django.db import models

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()   #URL欄位型態

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField()  #Email欄位型態

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author) # book 有1對多 authors 關係
    publisher = models.ForeignKey(Publisher) # 它是一個Publisher的ForeignKey
    publication_date = models.DateField() #日期欄位型態

更多欄位型態訊息請參考https://www.webforefront.com/django/modeldatatypesandvalidation.html
更多模式關係訊息請參考https://www.webforefront.com/django/setuprelationshipsdjangomodels.html


產生資料庫內容

 一但我們建立了model, 我們須要去建立新的或更新舊資料庫table內容,所以執行下面指令

python manage.py syncdb

 

系統會開始建立table, 如果是第一次執行系統會依INSTALLED_APPS 的內容開始產生table和一個superuser

Creating tables ...
Creating table django_admin_log
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table kaok_kaok

You just installed Django's auth system, which means you don't have any superuse
rs defined.
Would you like to create one now? (yes/no):yes
Username (leave blank to use 'XXX'): root
Email address: XXXX@gmail.com
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

假如你有異動INSTALLED_APPS 的內容,請再次執行 syncdb 以同步資料庫內容。
系統會在專案目錄下產生一個 db.sqlite3檔案。

 

與Model互動

當table 建立後你可能須要對table內容對S(查詢)、I(插入)、D(刪除)、U(更新),你可以利用指令去完成資料的操縱,或者你也可以用後面Admin介面去操控資料,更或者你可以使用熟悉的資料庫管理工具應該也可以操控資料,所以有興趣可以找一下其他資料。

python manage.py shell

 

Admin介面

amin是Djanog中內建的一個app,如果你没有移除它的話相信你在建table時就會看到它的table了。

要使用Admin介面要新增註冊資料至Admin.py,新增內容如下

 

from django.contrib import admin
from .models import kaok
admin.site.register(kaok)

 在瀏覽器輸入 http://127.0.0.1:8000/admin,可以看到管理後台的登入頁面:

如剛才無設定superuser,請用下指令新增

python manage.py createsuperuser

其他資料庫管理工具
  
我也下載了其他的資料庫管理工具,SQLiteStudio 事實證明使用其他的工具也是操縱所有的資料表內容。我利用這個軟體新增了二筆資料以作做後續程式測試使用。

回Django Web 程式設計主目錄

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

arrow
arrow
    文章標籤
    Django Models
    全站熱搜

    stanley 發表在 痞客邦 留言(0) 人氣()