Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

網站會不定期發佈技術筆記、職場心得相關的內容,歡迎關注本站!

網站
首頁關於我部落格
部落格
分類系列文

© 新人日誌. All rights reserved. 2020-present.

Django PositiveSmallIntegerField 新手指南

最後更新:2025年1月7日Python

本文為 留言評分功能 系列教學,第 3 篇:

  1. 使用 Django + Tailwind + Alpine.js 實作「五顆星評分」功能教學
  2. Django validators 驗證器完整教學
  3. Django PositiveSmallIntegerField 新手指南 👈 所在位置
  4. 在 esbuild 專案中整合 Alpine.js 的完整指南
  5. 使用 Alpine.js 建立星星評分表單 — 新手指南
  6. 深入理解 Alpine.js 中的 template 標籤使用指南
  7. Django 網站如何新增「星星評分」功能 — 後端接收邏輯
  8. Django 表單:如何讓使用者選擇性提交星星評分與留言
  9. Django 如何限制同一使用者只能對同一服務留言一次?
  10. Django 留言軟刪除邏輯|程式碼解析
  11. Django 計算評分摘要教學 — 使用 ORM 進行星等統計
  12. Python Django 使用 annotate、aggregate 統計教學
  13. 使用 Alpine.js 實作星級評分分佈 – 詳細教學
  14. Alpine.js 與 Tailwind CSS 動態樣式解析:為什麼有些樣式無法生效?
  15. Django 中使用 annotate() 與 Avg() 進行平均評分計算

在 Django 中,PositiveSmallIntegerField 是一種專門用於儲存 正整數 的欄位類型。

它適合儲存範圍較小且不需要負數的數值,如評分或小範圍的計數。

本篇文章將帶你了解這個欄位的用途、優勢以及與其他整數欄位的比較,讓你能夠在 Django 專案中正確選擇最適合的欄位類型。


什麼是 PositiveSmallIntegerField?

PositiveSmallIntegerField 是 Django ORM 提供的一種 數值型欄位,用於儲存非負的正整數。

核心特性

  • 數值範圍:只允許儲存 0 到 32,767 之間的正整數(16 位元)。
  • 用途:適合儲存小範圍的正整數數據,如:
    • 評分(如 1 到 5)
    • 庫存數量(範圍較小的庫存數)
    • 票數統計
  • 限制:
    • 只能儲存正整數(不包含負數)。
    • 超過 32,767 的數值會導致數據儲存失敗。

PositiveSmallIntegerField 的優勢

優點

  1. 節省資料庫空間
    • 只佔用 2 個位元組 (16 位元),比標準的整數欄位佔用空間更少。
  2. 自動限制負數
    • 內建限制,只允許正整數輸入,無需額外的驗證邏輯。
  3. 效能優化
    • 儲存空間小,適用於需要高效查詢與統計的場合,如投票系統或評分系統。

限制

  • 範圍較小:最多只能儲存到 32,767,如果需要儲存更大的數字,建議使用 PositiveIntegerField。
  • 僅限正整數:不適用於需要儲存負數的情境。

與其他整數欄位的比較

Django 提供了多種整數欄位類型,每種欄位的儲存範圍與適用情境各不相同。

以下是 PositiveSmallIntegerField 與其他常用整數欄位的比較表格:

欄位類型儲存範圍位元組大小適用情境
PositiveSmallIntegerField0 到 32,7672 字節(16 位元)小範圍的正整數(如評分、票數)
SmallIntegerField-32,768 到 32,7672 字節(16 位元)小範圍的正負整數(如溫度、座標偏移)
PositiveIntegerField0 到 2,147,483,6474 字節(32 位元)一般範圍的正整數(如用戶積分)
IntegerField-2,147,483,648 到 2,147,483,6474 字節(32 位元)一般範圍的正負整數(如年齡)
BigIntegerField超過 9 兆8 字節(64 位元)儲存超大數值(如金額、瀏覽數)
儲存範圍0 到 32,767
位元組大小2 字節(16 位元)
適用情境小範圍的正整數(如評分、票數)
儲存範圍-32,768 到 32,767
位元組大小2 字節(16 位元)
適用情境小範圍的正負整數(如溫度、座標偏移)
儲存範圍0 到 2,147,483,647
位元組大小4 字節(32 位元)
適用情境一般範圍的正整數(如用戶積分)
儲存範圍-2,147,483,648 到 2,147,483,647
位元組大小4 字節(32 位元)
適用情境一般範圍的正負整數(如年齡)
儲存範圍超過 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 的使用時機與最佳實踐!😊

目前還沒有留言,成為第一個留言的人吧!

發表留言

留言將在審核後顯示。

Python

目錄

  • 什麼是 PositiveSmallIntegerField?
  • 核心特性
  • PositiveSmallIntegerField 的優勢
  • 優點
  • 限制
  • 與其他整數欄位的比較
  • 何時使用 PositiveSmallIntegerField?
  • 適合的使用情境
  • 不適用的情境
  • PositiveSmallIntegerField 的最佳實踐
  • 搭配驗證器 (Validators)
  • 優化查詢
  • 總結
  • 選擇指南回顧: