Django 是一個知名的網頁框架,用於快速開發安全且易於維護的網站和網頁應用程式。它使用 Python,Django 簡化了網頁開發,讓您有更多時間專注於編寫應用程式,而無需每次都重新造輪子。Django 是一個免費且開源的專案,擁有完善的官方文件、強大的社群支持以及豐富的免費和付費支援。
在本指南中,我們將深入探討如何建立 Django 模型。 在 Django 中,模型 是關於您資料的主要資訊來源。模型描述了要儲存的資料的欄位和行為。Django 使用該模型透過 ORM(物件關係對映,Object Relational Mapping)來生成資料庫資料表,這些也被稱為模型。
先決條件
我們是在類 Unix 作業系統上進行操作,首選是 Ubuntu 20.04 雲端伺服器 作為我們測試過的系統。如果您想在類似的環境中設定 Django,請參考我們的教學課程:『如何在 Ubuntu 20.04 上安裝 Django 並設定開發環境.”
步驟 1. Python 開發環境
Django 是建構於 Python 之上。因此,我們需要一個強大的 Python 開發環境,其中包含處理 Python 應用程式所需的所有工具。我們已經在專屬指南中討論過。在這裡,我們將進行簡短的示範。
首先,啟動終端機並執行以下指令:
|
1 2 |
$ sudo apt update && sudo apt upgrade -y $ sudo apt install python3 python-is-python3 |
接下來,安裝 pip – Python 套件管理器:
|
1 |
$ sudo apt install python3-pip |
然後,安裝一些額外的開發套件:
|
1 |
$ sudo apt install build-essential libssl-dev libffi-dev python3-dev |
為了建立虛擬環境,我們還需要 Python 的 venv 模組:
|
1 |
$ sudo apt install python3-venv |
步驟 2. 安裝 MySQL 伺服器
MySQL 是一款受歡迎的關聯式資料庫管理系統。它開源、穩定且功能豐富。我們將使用 MySQL 作為我們 Django 應用程式的資料庫伺服器。使用 APT 安裝 MySQL:
|
1 |
$ sudo apt install mysql-server |
接下來,驗證安裝:
|
1 |
$ systemctl status mysql |
這只是使用預設選項的 MySQL 基本設定。請參閱更深入的指南:MySQL 安裝與設定.
步驟 3. 設定 Django 應用程式
我們現在準備好建立我們的 Django 應用程式。如果您對 Django 的進一步深入示範感興趣,請參考我們的教學課程:『在 Ubuntu 20.04 上安裝 Django 網頁框架.”
接下來,為應用程式建立一個專屬目錄。目錄名稱應反映專案名稱:
|
1 |
$ mkdir -pv <project_dir> |
在專案目錄中,使用 venv 模組建立 Python 虛擬環境:
|
1 |
$ python3 -m venv <virtual_env_name> |
啟用虛擬環境:
|
1 |
$ . sample_app_env/bin/activate |
使用 pip:
|
1 |
$ pip install django |
接下來,使用 django-admin 指令建立一個新的 Django 專案:
|
1 |
$ django-admin startproject sample_app |
步驟 4. 設定 Django 應用程式
Django 應用程式包含所有預設設定。為了達到我們的目標,我們需要進行一些調整。
首先編輯設定檔 settings.py:
|
1 |
$ nano sample_app/sample_app/sample_app/settings.py |
然後,變更時區:
|
1 |
$ TIME_ZONE = '<time_zone>' |
新增允許存取 Django 應用程式伺服器的機器:
|
1 |
$ ALLOWED_HOSTS = ['<allowed_host_ip_or_domain_name >'] |
之後,套用變更:
|
1 |
$ python manage.py migrate |
最後,為我們的 Django 網頁應用程式建立一個超級使用者:
|
1 |
$ python manage.py createsuperuser |
步驟 5. 將 Django 應用程式連接到 MySQL
要連接到 MySQL,我們需要一個與 Django 相容的額外 Python 連接器函式庫。我們將使用 mysqlclient.
首先,確保我們已安裝必要的套件:
|
1 |
$ sudo apt install python3-dev libmysqlclient-dev default-libmysqlclient-dev |
接下來,安裝 mysqlclient:
|
1 |
$ pip install mysqlclient |
- 建立專用資料庫
對於我們的應用程式,我們需要建立一個專用的資料庫和資料庫使用者。以 root:
|
1 |
$ sudo mysql -u root |
|
1 |
$ CREATE DATABASE <dedicated_database>; |
然後,為 Django 應用程式建立一個專用資料庫使用者:
|
1 |
$ CREATE USER '<username>'@'%' IDENTIFIED WITH mysql_native_password BY '<user_password>'; |
最後,授予該專用使用者對該專用資料庫的完整權限:
|
1 |
$ GRANT ALL ON <database>.* TO '<username'@'%'; |
- 修改 Django 設定以使用 MySQL
現在,我們需要調整一些 Django 設定,以便它可以使用 MySQL 作為資料庫伺服器。在文字編輯器中開啟 settings.py:
|
1 |
$ nano settings.py |
向下滾動到 DATABASES 區段並貼上以下程式碼:
|
1 2 3 4 5 6 7 8 |
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'OPTIONS': { 'read_default_file': '/etc/mysql/my.cnf', }, } } |
接下來,編輯 MySQL 設定檔,使其包含必要的資料庫憑證:
|
1 |
$ sudo nano /etc/mysql/my.cnf |
在檔案末尾新增以下區塊:
|
1 2 3 4 5 |
[client] database = <dedicated_database> user = <dedicated_user> password = <user_password> default-character-set = utf8 |
重新啟動 MySQL 以使變更生效:
|
1 2 |
$ sudo systemctl daemon-reload $ sudo systemctl restart mysql |
步驟 6. 建立 Django 模型
我們現在準備在 Django 專案中建立一個新模型。啟用虛擬環境:
|
1 2 3 |
$ cd sample_app/ $ . sample_app_env/bin/activate $ cd sample_app/ |
在此位置,指示 Django 建立一個新應用程式:
|
1 |
$ python manage.py startapp <new_app> |
建立後,檔案樹應該看起來像這樣。在這裡,檔案 models.py 將包含我們自訂 Django 模型的程式碼:
檢查檔案的目前內容:
|
1 |
$ cat models.py |
為了進行示範,我們將為部落格文章建立一個名為 Post 的模型。它將包含以下欄位:
title:部落格文章標題。slug:儲存並產生網頁的有效 URL。content:部落格文章內文。created_on:文章建立日期。author:建立文章的使用者。
在文字編輯器中開啟 models.py 檔案:
|
1 |
$ nano models.py |
讓我們為模型匯入一些必要的 API。預設情況下,它會匯入 models API。我們還需要 slugify API 用於產生 slug、User 用於身分驗證,以及 reverse 以實現更好且更具彈性的 URL 建立:
|
1 2 3 4 |
from django.db import models from django.template.defaultfilters import slugify from django.contrib.auth.models import User from django.urls import reverse |
接下來,新增名為 Post 的類別方法。它將包含必要的資料庫欄位,例如 title, slug, content, created_on, 和 author:
|
1 2 3 4 5 6 |
class Post(models.Model): title = models.CharField(max_length=255) slug = models.SlugField(unique=True, max_length=255) content = models.TextField() created_on = models.DateTimeField(auto_now_add=True) author = models.TextField() |
我們需要用於生成 URL 和儲存文章的功能。這很重要,因為它會生成與唯一文章相匹配的唯一連結:
|
1 2 3 4 5 6 7 |
def get_absolute_url(self): return reverse('blog_post_detail', args=[self.slug]) def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.title) super(Post, self).save(*args, **kwargs) |
下一節將告訴模型如何對文章進行排序並將其顯示在網頁上。我們將使用內部類別來編碼該邏輯,即 Meta。它將包含與資料庫欄位定義無關的其他模型邏輯:
|
1 2 3 4 5 |
class Meta: ordering = ['created_on'] def __unicode__(self): return self.title |
最後,我們將在此檔案中加入 Comment 模型的功能。這需要新增另一個類別 Comment,並使用 models.Model 作為其簽章。它將包含以下資料庫欄位:
- name:評論者的姓名。
- email:評論者的電子郵件地址。
- text:評論本身的內容。
- post:發表該評論的文章。
- created_on:評論建立的時間。
程式碼看起來會像這樣:
|
1 2 3 4 5 6 7 |
class Comment(models.Model): name = models.CharField(max_length=42) email = models.EmailField(max_length=75) website = models.URLField(max_length=200, null=True, blank=True) content = models.TextField() post = models.ForeignKey(Post, on_delete=models.CASCADE) created_on = models.DateTimeField(auto_now_add=True) |
此時,我們的 models.py 檔案看起來會像這樣:
最後,儲存檔案並關閉編輯器。
步驟 7. 更新 Django 設定
模型已建立。然而,我們需要調整一些設定檔才能讓模型發揮作用。在 settings.py 中,我們需要將我們的模型新增至 INSTALLED_APPS.
開啟 settings.py 於文字編輯器中:
|
1 |
$ nano settings.py |
在以下區段下註冊新模組:INSTALLED_APPS:
儲存檔案並關閉編輯器。
步驟 8. 遷移變更
現在我們已經新增了所有想要的模型,下一步就是套用這些變更。Django 將會把這些結構描述套用到我們的 MySQL 資料庫。
以下指令將生成所有必要的遷移檔案。輸出將顯示專案目錄中所有這些檔案的位置:
|
1 |
$ python manage.py makemigrations |
以下指令將列出所有現有的遷移:
|
1 |
$ python manage.py showmigrations |
請注意,除了 0001_initial 之外,所有的遷移都已標記,該遷移是作為以下模型的一部分而建立的:Post 和 Comment.
以下指令將顯示 Django 將執行什麼 SQL 查詢來進行遷移:
|
1 |
$ python manage.py sqlmigrate random_app 0001_initial |
我們現在只需要套用遷移。這些遷移會將變更寫入資料庫:
|
1 |
$ python manage.py migrate |
步驟 9. 驗證變更
要驗證變更,讓我們來查看我們的 MySQL 資料庫。以 Django 使用者身分啟動 MySQL shell:
|
1 |
$ mysql sample_app_data -u sample_app_user |
接下來,將目前作用中的資料庫切換為 Django 應用程式資料庫:
|
1 |
$ USE <django_dedicated_database>; |
列出資料庫中的所有資料表:
|
1 |
$ SHOW TABLES; |
最後,若要查看任何資料表的內容,請使用 DESCRIBE 查詢:
|
1 2 |
$ DESCRIBE random_app_comment; $ DESCRIBE random_app_post; |
Django 搭配 MySQL 的限制
當使用 MySQL 作為 Django 應用程式的資料庫伺服器時,有幾件事需要注意:
- 對於涉及結構變更(schema-altering)的程序,交易(transaction)支援度並不高。這意味著,如果遷移(migration)失敗,在嘗試另一次遷移之前,需要手動撤銷所有已發生的變更。無法還原到失敗遷移發生之前的狀態。
- 對於大多數結構變更程序,MySQL 會完全重寫資料表。在某些情況下,這可能會非常耗時。在最壞的情況下,時間複雜度將與要新增的資料列數或要刪除的資料欄數成正比。根據 Django 官方文件,每百萬列可能需要一分鐘的時間。
- MySQL 對資料欄、資料表和索引的名稱長度強制執行字元限制。所有資料欄和索引涵蓋的總大小也有限制。Django 的設定可能會超出此限制。除了 MySQL 之外,某些後端可以處理 Django 較高的限制。
這就是為什麼強烈建議您權衡各種選擇並選擇合適的方案。
結語
本指南成功示範了如何向現有的 Django 應用程式新增模組。我們使用 MySQL 作為該應用程式的後端。它還展示了一些關鍵的 Django 概念,例如模型(models)、遷移(migration)的運作方式,以及 Django 如何將模型轉換為 MySQL 資料庫資料表。
祝您開發愉快!






















留言
目前尚無留言。成為第一個留言的人吧。