(七) Creating models

今天來到Django鐵三角MVT的Models,定義我們使用的資料的型態。

第一步

初步先設計兩個models:Question和Choice。
♦︎ Question的欄位有question_text ➢ 測驗中的題目。
♦︎ Choice有三個欄位:
choice_text ➢ 題目的選項
score ➢ 分數,正確答案得10分
question ➢ 先試想,一個題目下有多個選項(而且每道題的選項數目不一定一致),是一對多的關係。在Choice下引用Quesiton這個外鍵ForeignKey,就是讓每個Choice都有跟隨的Question,每個選項應對應的題目。

1
from django.db import modelsclass 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)
  1. ForeignKey裡的第二個參數on_delete=models.CASCADE用意是說當Question遭刪除,Choice也會同步刪除,畢竟題目都沒了,答案就不需要存在。
  2. Charfiled表示該欄位為字串格式,並要求設置字串上限max_length。
  3. IntegerField表示該欄為整數,我預先設置為0。

第二步

到settings.py做設定,將quiz.apps.QuizConfig(每個app都是使用路徑做描述)加進INSTLLED_APPS。

1
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執行下面語句:

1
python manage.py makemigrations quiz

執行完會跑出下面這些:

1
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裡面的檔案,確認到底改到哪,導致亂改模型改到整個專案沒法正常執行。

還要再做一個步驟,資料庫裡的資料才會做變動:

1
python manage.py migrate

執行完會看到:

1
Operations to perform:  Apply all migrations: admin, auth, contenttypes, quiz, sessionsRunning migrations:  Applying quiz.0001_initial... OK

當然就可以在pgadmin裡看到新增的兩個tables了。
https://ithelp.ithome.com.tw/upload/images/20200908/20129725aQ22yPwyz4.png

最後切記每次更動資料模型時的步驟:
♦︎ 修改models.py
♦︎ 執行python manage.py makemigrations來產生記錄檔。
♦︎ 執行python manage.py migrate變動資料庫。

剛開始在嘗試的時候,因為沒去詳細了解資料模型更動時的步驟,導致Django出現判讀錯亂,migrations裡的紀錄跟資料庫根本對不上,這當然會造就專案沒法執行出現Error,但辦法總是人想出來的,明天就來寫寫一般怎麼處理這種情況。另外想再研究一下quiz/apps.py的作用到底是什麼,然後重新整理筆記一下!~~~~