今天來到Django鐵三角MVT的Models,定義我們使用的資料的型態。
初步先設計兩個models:Question和Choice。
♦︎ Question的欄位有question_text ➢ 測驗中的題目。
♦︎ Choice有三個欄位:
choice_text ➢ 題目的選項
score ➢ 分數,正確答案得10分
question ➢ 先試想,一個題目下有多個選項(而且每道題的選項數目不一定一致),是一對多的關係。在Choice下引用Quesiton這個外鍵ForeignKey,就是讓每個Choice都有跟隨的Question,每個選項應對應的題目。
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
score = models.IntegerField(default=0)
到settings.py做設定,將quiz.apps.QuizConfig(每個app都是使用路徑做描述)加進INSTLLED_APPS。
INSTALLED_APPS = [
'quiz.apps.QuizConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
這邊是告訴Django新增一個app,正式啟動quiz app~
在terminal執行下面語句:
python manage.py makemigrations quiz
執行完會跑出下面這些:
Migrations for 'quiz':
quiz/migrations/0001_initial.py
- Create model Question
- Create model Choice
注意到quiz底下有個migrations的資料夾,此時多了個0001_initial.py檔案,之後只要有變動models.py,就必須執行makemigrations,然後Django就會在migrations新增一個檔案來記錄開發者所做的資料模型變更。
一開始傻傻地不知道要去查看migrations裡面的檔案,確認到底改到哪,導致亂改模型改到整個專案沒法正常執行。
還要再做一個步驟,資料庫裡的資料才會做變動:
python manage.py migrate
執行完會看到:
Operations to perform:
Apply all migrations: admin, auth, contenttypes, quiz, sessions
Running migrations:
Applying quiz.0001_initial... OK
當然就可以在pgadmin裡看到新增的兩個tables了。
最後切記每次更動資料模型時的步驟:
♦︎ 修改models.py
♦︎ 執行python manage.py makemigrations來產生記錄檔。
♦︎ 執行python manage.py migrate變動資料庫。
剛開始在嘗試的時候,因為沒去詳細了解資料模型更動時的步驟,導致Django出現判讀錯亂,migrations裡的紀錄跟資料庫根本對不上,這當然會造就專案沒法執行出現Error,但辦法總是人想出來的,明天就來寫寫一般怎麼處理這種情況。另外想再研究一下quiz/apps.py的作用到底是什麼,然後重新整理筆記一下!