今天來到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) |
- ForeignKey裡的第二個參數on_delete=models.CASCADE用意是說當Question遭刪除,Choice也會同步刪除,畢竟題目都沒了,答案就不需要存在。
- Charfiled表示該欄位為字串格式,並要求設置字串上限max_length。
- 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了。
最後切記每次更動資料模型時的步驟:
♦︎ 修改models.py
♦︎ 執行python manage.py makemigrations來產生記錄檔。
♦︎ 執行python manage.py migrate變動資料庫。
剛開始在嘗試的時候,因為沒去詳細了解資料模型更動時的步驟,導致Django出現判讀錯亂,migrations裡的紀錄跟資料庫根本對不上,這當然會造就專案沒法執行出現Error,但辦法總是人想出來的,明天就來寫寫一般怎麼處理這種情況。另外想再研究一下quiz/apps.py的作用到底是什麼,然後重新整理筆記一下!~~~~