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內容,所以執行下面指令
系統會開始建立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介面去操控資料,更或者你可以使用熟悉的資料庫管理工具應該也可以操控資料,所以有興趣可以找一下其他資料。
Admin介面
amin是Djanog中內建的一個app,如果你没有移除它的話相信你在建table時就會看到它的table了。
要使用Admin介面要新增註冊資料至Admin.py,新增內容如下
在瀏覽器輸入 http://127.0.0.1:8000/admin,可以看到管理後台的登入頁面:
如剛才無設定superuser,請用下指令新增
python manage.py createsuperuser
其他資料庫管理工具
我也下載了其他的資料庫管理工具,SQLiteStudio 事實證明使用其他的工具也是操縱所有的資料表內容。我利用這個軟體新增了二筆資料以作做後續程式測試使用。
留言列表