Django PositiveSmallIntegerField 新手指南
更新日期: 2025 年 1 月 7 日
本文為 留言評分功能 系列教學,第 3 篇:
- 使用 Django + Tailwind + Alpine.js 實作「五顆星評分」功能教學
- Django validators 驗證器完整教學
- Django PositiveSmallIntegerField 新手指南 👈 所在位置
- 在 esbuild 專案中整合 Alpine.js 的完整指南
- 使用 Alpine.js 建立星星評分表單 — 新手指南
- 深入理解 Alpine.js 中的 template 標籤使用指南
- Django 網站如何新增「星星評分」功能 — 後端接收邏輯
- Django 表單:如何讓使用者選擇性提交星星評分與留言
- Django 如何限制同一使用者只能對同一服務留言一次?
- Django 留言軟刪除邏輯|程式碼解析
- Django 計算評分摘要教學 — 使用 ORM 進行星等統計
- Python Django 使用 annotate、aggregate 統計教學
- 使用 Alpine.js 實作星級評分分佈 – 詳細教學
- Alpine.js 與 Tailwind CSS 動態樣式解析:為什麼有些樣式無法生效?
- Django 中使用 annotate() 與 Avg() 進行平均評分計算
在 Django 中,PositiveSmallIntegerField
是一種專門用於儲存 正整數 的欄位類型。
它適合儲存範圍較小且不需要負數的數值,如評分或小範圍的計數。
本篇文章將帶你了解這個欄位的用途、優勢以及與其他整數欄位的比較,讓你能夠在 Django 專案中正確選擇最適合的欄位類型。
什麼是 PositiveSmallIntegerField
?
PositiveSmallIntegerField
是 Django ORM 提供的一種 數值型欄位,用於儲存非負的正整數。
核心特性
- 數值範圍:只允許儲存 0 到 32,767 之間的正整數(16 位元)。
- 用途:適合儲存小範圍的正整數數據,如:
- 評分(如 1 到 5)
- 庫存數量(範圍較小的庫存數)
- 票數統計
- 限制:
- 只能儲存正整數(不包含負數)。
- 超過 32,767 的數值會導致數據儲存失敗。
PositiveSmallIntegerField
的優勢
優點
- 節省資料庫空間
- 只佔用 2 個位元組 (16 位元),比標準的整數欄位佔用空間更少。
- 自動限制負數
- 內建限制,只允許正整數輸入,無需額外的驗證邏輯。
- 效能優化
- 儲存空間小,適用於需要高效查詢與統計的場合,如投票系統或評分系統。
限制
- 範圍較小:最多只能儲存到 32,767,如果需要儲存更大的數字,建議使用
PositiveIntegerField
。 - 僅限正整數:不適用於需要儲存負數的情境。
與其他整數欄位的比較
Django 提供了多種整數欄位類型,每種欄位的儲存範圍與適用情境各不相同。
以下是 PositiveSmallIntegerField
與其他常用整數欄位的比較表格:
欄位類型 | 儲存範圍 | 位元組大小 | 適用情境 |
---|---|---|---|
PositiveSmallIntegerField | 0 到 32,767 | 2 字節(16 位元) | 小範圍的正整數(如評分、票數) |
SmallIntegerField | -32,768 到 32,767 | 2 字節(16 位元) | 小範圍的正負整數(如溫度、座標偏移) |
PositiveIntegerField | 0 到 2,147,483,647 | 4 字節(32 位元) | 一般範圍的正整數(如用戶積分) |
IntegerField | -2,147,483,648 到 2,147,483,647 | 4 字節(32 位元) | 一般範圍的正負整數(如年齡) |
BigIntegerField | 超過 9 兆 | 8 字節(64 位元) | 儲存超大數值(如金額、瀏覽數) |
何時使用 PositiveSmallIntegerField
?
適合的使用情境
- 評分系統:如 1 到 5 顆星的評分。
- 投票系統:統計小範圍的票數或投票結果。
- 庫存管理:小型店面的庫存數量(不超過 32,767)。
- 等級與階層:如遊戲中的角色等級或經驗值等。
不適用的情境
- 需要儲存負數 → 使用
SmallIntegerField
或IntegerField
- 需要儲存極大數值 → 使用
BigIntegerField
- 大範圍正整數 → 使用
PositiveIntegerField
PositiveSmallIntegerField
的最佳實踐
搭配驗證器 (Validators)
雖然 PositiveSmallIntegerField
自帶正整數限制,但你仍可以使用 Django 的 validators
進一步限制範圍,例如限制分數在 1 到 5 之間。
from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator
class Rating(models.Model):
rating = models.PositiveSmallIntegerField(
validators=[
MinValueValidator(1),
MaxValueValidator(5)
]
)
優化查詢
由於這類欄位適用於小型數據,建議搭配索引以提高查詢效能:
class Rating(models.Model):
rating = models.PositiveSmallIntegerField(db_index=True)
補充:索引是什麼?
在 Django 的模型欄位中,
db_index=True
是用來在資料庫中建立 索引 (Index) 的參數。這個設定可以顯著提高查詢效率,尤其是在對大量數據進行篩選或排序時非常有用。
索引是一種資料庫的優化技術,本質上是一種特殊的資料結構,用於加速對資料的檢索操作。
它就像一本書的目錄,可以幫助資料庫更快地定位到符合條件的數據,而不需要逐筆掃描整個資料表。
當你在 rating 欄位上使用 db_index=True,Django 會在資料庫中自動建立索引。
查詢時,資料庫會優先使用這個索引進行搜尋,而非逐筆掃描整個資料表。
舉例:
- 如果你有一個包含 100 萬筆評分紀錄的資料表,當你查詢「所有評分為 5 分的紀錄」時,沒有索引的情況下,資料庫需要逐筆檢查每條記錄。
- 若針對
rating
欄位建立索引,資料庫會根據索引快速跳轉到所有符合條件的紀錄,查詢速度可提升數十倍甚至更多。
db_index=True
的優點✅ 查詢速度更快
- 對於需要篩選 (
filter
) 或排序 (order_by
) 的欄位,能顯著提高查詢效能。✅ 適用於大量數據
- 對於擁有數千筆以上記錄的資料表,索引能減少搜尋時間。
✅ 自動化管理
- 使用
db_index=True
,Django 會自動在資料庫中建立索引,無需手動管理。
db_index=True
的限制與注意事項❗ 占用額外的儲存空間
- 索引需要額外的磁碟空間來存儲索引資料結構。
- 對於小型數據表 (如幾百筆資料),使用索引的效益不明顯。
❗ 影響寫入效能
- 在插入或更新資料時,索引需要同步更新,可能會降低寫入 (INSERT/UPDATE) 的速度。
- 因此,不建議為經常變動的欄位(如狀態欄位)建立索引。
❗ 過多的索引可能降低效能
- 每個索引都需要維護,因此若在多個欄位上建立索引,可能導致效能下降。
總結
PositiveSmallIntegerField
是一個適用於 小範圍正整數 的 Django 模型欄位。
它的優勢在於節省資料庫空間並自動防止負數輸入,特別適合用於評分系統、票數計算等場景。
然而,選擇正確的欄位類型需要根據數據的範圍與儲存需求來決定。
選擇指南回顧:
- 適合小範圍正整數 →
PositiveSmallIntegerField
- 需要支援負數 →
SmallIntegerField
- 一般範圍正整數 →
PositiveIntegerField
- 極大數據 →
BigIntegerField
希望這篇文章能幫助你更了解 PositiveSmallIntegerField
的使用時機與最佳實踐!😊