iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 8
0
Modern Web

Django案例實作之踩坑全記錄系列 第 8

Creating models

今天來到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)
  1. ForeignKey裡的第二個參數on_delete=models.CASCADE用意是說當Question遭刪除,Choice也會同步刪除,畢竟題目都沒了,答案就不需要存在。
  2. Charfiled表示該欄位為字串格式,並要求設置字串上限max_length。
  3. IntegerField表示該欄為整數,我預先設置為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了。
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的作用到底是什麼,然後重新整理筆記一下!


上一篇
Django - PostgreSQL
下一篇
資料模型重置方法
系列文
Django案例實作之踩坑全記錄34
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言