Django模型開發:模型字段、元數據與繼承全方位講解

文章目錄

    • 一、模型字段類型詳解
      • Django 與 MySQL 字段類型映射
      • 整數類型深度對比
    • 二、常用字段選項
      • null 與 blank 的區別
      • 注釋與幫助文本
      • 默認值設置
      • 日期時間特殊選項
      • 選項列表(choices)
    • 三、模型元數據與方法
      • 模型 Meta 類
      • 模型管理器(Manager)
      • 自定義模型方法
    • 四、模型繼承
      • 抽象基類
      • 模型繼承實戰


一、模型字段類型詳解

在 Django 開發中,模型(Model)是連接應用程序與數據庫的核心橋梁。

Django 與 MySQL 字段類型映射

Django 模型的每個字段都是特定 Field 類的實例,它決定了數據庫存儲類型和表單驗證規則。

Django 字段類型MySQL 數據類型說明
CharFieldVARCHAR字符串類型,需指定 max_length
TextFieldTEXT長文本類型
IntegerFieldINT整數類型
BigIntegerFieldBIGINT長整數類型
BooleanFieldTINYINT(1)布爾類型(0=False,1=True)
DateTimeFieldDATETIME日期時間類型
SmallIntegerFieldSMALLINT小整數類型

整數類型深度對比

TINYINTSMALLINT是兩種常用的整數類型,選擇合適的類型能優化存儲效率

維度TINYINTSMALLINT
存儲空間1 字節(8 位)2 字節(16 位)
有符號范圍-128 到 127-32768 到 32767
無符號范圍0 到 2550 到 65535
適用場景布爾值、狀態標記、年齡、枚舉值等小范圍數值用戶積分、訂單數量等中等范圍數值
示例年齡(0-120)、月份(1-12)、星期(1-7)用戶積分(0-5000)、訂單數量(0-30000)

二、常用字段選項

字段選項用于配置字段的行為特性,以下是開發中最常用的選項

null 與 blank 的區別

# null影響數據庫存儲,blank影響表單驗證
field1 = models.CharField(max_length=100, null=True)  # 數據庫可存NULL
field2 = models.CharField(max_length=100, blank=True)  # 表單可提交空值
field3 = models.CharField(max_length=100, null=True, blank=True)  # 兩者皆可
  • null=True:允許數據庫存儲 NULL 值(默認 False)
  • blank=True:允許表單提交空值(默認 False)
  • 注意:前端提交""空字符串時,若blank=False會觸發驗證錯誤

注釋與幫助文本

class Book(models.Model):title = models.CharField(max_length=100,help_text='Enter the book title',  # 表單幫助文本db_comment="圖書標題"  # 數據庫字段注釋(Django4.2+))class Meta:db_table_comment = 'This table stores information about books.'  # 數據庫表注釋
  • help_text:表單幫助文本
  • db_comment: 數據庫字段注釋

默認值設置

# 固定默認值
count = models.IntegerField(default=0)# 可調用對象作為默認值
from datetime import date
birth_date = models.DateField(default=date.today)
  • default : 該字段的默認值

日期時間特殊選項

class BaseModel(models.Model):# 首次創建時自動設置當前時間created_at = models.DateTimeField(auto_now_add=True)# 每次save()時自動更新為當前時間updated_at = models.DateTimeField(auto_now=True)

注意:

  • auto_now在QuerySet.update()時不會自動生效,需手動更新或使用save()
  • auto_now_add、auto_now 和 default 選項相互排斥,這些選項的任何組合都會導致報錯
class Article(models.Model):def save(self, *args, **kwargs):if not self.pk:  # 僅在首次創建時設置self.created_at = timezone.now()self.updated_at = timezone.now()super().save(*args, **kwargs)
  • 當需要復雜時間邏輯時,覆蓋模型的 save() 方法

選項列表(choices)

使用choices定義字段的可選值范圍

# 直接定義選項
class Person(models.Model):SHIRT_SIZES = [("S", "Small"),("M", "Medium"),("L", "Large"),]shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)# 枚舉類定義選項(推薦)
from enum import Enum
class UserTypeEnum(Enum):MEMBER = 1  # 會員ADMIN = 2   # 管理員class User(models.Model):user_type = models.SmallIntegerField(choices=[(item.value, item.name) for item in UserTypeEnum],default=UserTypeEnum.MEMBER.value)

三、模型元數據與方法

模型 Meta 類

通過內部Meta類定義模型的元數據,即 “非字段信息”

class User(models.Model):username = models.CharField(max_length=50)email = models.EmailField()class Meta:db_table = "system_users"  # 數據庫表名db_table_comment = "用戶信息表"  # 數據庫表注釋ordering = ['-id']  # 默認排序verbose_name = "用戶"  # 單數顯示名verbose_name_plural = "用戶"  # 復數顯示名

managed=False適用于:

  • 與遺留數據庫集成時
  • 不希望 Django 自動修改表結構的場景

模型管理器(Manager)

Manager 是模型與數據庫交互的接口,默認名為objects。 模型管理器只能通過模型類來訪問,一般用于“表級”操作

# 表級操作
all_users = User.objects.all()
active_users = User.objects.filter(is_active=True)
user = User.objects.get(id=1)

自定義模型方法

模型方法用于實現 “行級” 操作,可自定義業務邏輯

  • 重寫 save() 方法:例如實現保存前后的處理
  • 重寫 delete() 方法:例如實現軟刪除
  • 其它自定義方法:例如編寫原生 SQL 語句
class Blog(models.Model):name = models.CharField(max_length=100)tagline = models.TextField()def save(self, *args, **kwargs):# 保存前處理self.name = self.name.title()super().save(*args, **kwargs)  # 調用父類方法# 保存后操作self.clear_cache()def clear_cache(self):"""自定義緩存清理方法"""cache.delete(f"blog_{self.id}")

注意:重寫的模型方法不會在批量操作(例如update())中調用

四、模型繼承

抽象基類

將公共字段提取到抽象基類,避免代碼重復

class CommonInfo(models.Model):"""抽象基類:包含公共字段"""name = models.CharField(max_length=100)age = models.PositiveIntegerField()created_at = models.DateTimeField(auto_now_add=True)class Meta:abstract = True  # 標記為抽象類,不生成數據表# 繼承抽象基類
class Student(CommonInfo):home_group = models.CharField(max_length=5)# 自動擁有name, age, created_at字段class Teacher(CommonInfo):department = models.CharField(max_length=50)# 自動擁有name, age, created_at字段

模型繼承實戰

實戰場景:在一個Django+Vue 后臺管理系統中,需要維護多個數據表。這些數據表中,一般需要記錄創建者、創建時間、更新者和更新時間等信息。可將該部分公共字段提取到抽象基類,避免代碼重復。

定義抽象基類BaseModel

from django.db import modelsclass BaseModel(models.Model):creator = models.CharField(max_length=64, blank=True, null=True, default="", db_comment="創建者")create_time = models.DateTimeField(auto_now_add=True, db_comment="創建時間")updater = models.CharField(max_length=64, blank=True, null=True, default="", db_comment="更新者")update_time = models.DateTimeField(auto_now=True, db_comment="更新時間")class Meta:abstract = True

繼承抽象基類:點擊查看完整代碼

在這里插入圖片描述

實現效果

在這里插入圖片描述


您正在閱讀的是《Django從入門到實戰》專欄!關注不迷路~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91046.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91046.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91046.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

墨者:SQL注入實戰-MySQL

1. 墨者學院:SQL注入實戰-MySQL🚀 2. 實訓重點目標? 目標一: 了解sqlmap的使用及其tamper插件的使用; 目標二: 了解base64編碼及解碼。 3. 解題方向🔍 目標網站的id參數通過Base64編碼傳輸,…

Milvus 實戰全流程

📚 學習路徑總覽1. Milvus 基礎知識什么是向量數據庫?Milvus 的核心概念(collection、field、index、partition、segment)Milvus 和 Faiss、Annoy、HNSW 的區別2. 安裝與部署Docker 快速部署 Milvus(推薦)本…

Mysql數據庫基礎(入門)

目錄 一.認識Sql 1.什么是Sql 2.Sql的作用 3.Sql通用語法 4.Sql分類 二.數據庫的操作(DDL) 1.創建數據庫 2.顯示/使用數據庫 3.修改數據庫 4.刪除數據庫 三.常用數據類型 1.數值類型 2.字符串類型 3.日期類型 4.詳細的數據類型 四.表的操…

MySQL 鎖機制 15 連問 · 面試速答版

一、腦圖:鎖全景(先記結構,再填細節) 鎖層級 ├─ 表鎖 │ ├─ 意向鎖 IS / IX │ └─ 表鎖 READ / WRITE └─ 行鎖├─ 記錄鎖 Record├─ 間隙鎖 Gap└─ 臨鍵鎖 Next-Key二、15 問 15 答(面試官一問一…

【Linux】發展歷程

很高興為您詳細介紹Linux操作系統的詳細發展歷程。Linux是一個自由和開放源代碼的操作系統內核,由林納斯托瓦茲(Linus Torvalds)于1991年首次發布。以下是Linux操作系統的主要發展里程碑:1. Linux 0.01 (1991)發布日期&#xff1a…

LNMP架構+wordpress實現動靜分離

WordPress簡稱WP,最初是一款博客系統,后逐步演化成一款免費的CMS(內容管理系統/建站系統)。 WordPress網站的適用場景: 博客 企業官網 作品集網站 電商平臺 線上教育系統 論壇和社群網站 甚至會員系統、訂閱內容…

智慧燈桿:不止于照明,塔能科技的城市感知網絡野心

當夜幕悄然降臨,城市里的路燈便依次亮了起來,它們可不單單照亮了行人前行的路以及車輛行駛的道路,實際上還在悄無聲息地經歷著一場變革。現如今的路燈,早已不再僅僅充當單純的照明工具這么一個角色了,而是逐漸轉變成了…

【Linux內核模塊】調試技巧

內核模塊開發最讓人頭疼的不是寫代碼,而是調試 —— 代碼編譯通過了,加載后卻要么沒反應,要么直接讓系統崩潰。這就像在黑屋子里修機器,看不見摸不著。其實內核調試有一套成熟的工具箱,掌握這些工具和技巧,…

RK3568筆記九十一:QT環境搭建

若該文為原創文章,轉載請注明原文出處。 記錄按照正點原子給的手冊搭建QT環境 參考《09【正點原子】ATK-DLRK3568_Qt開發環境搭建V1.2.pdf》 一、安裝 1、下載 https://mirrors.sau.edu.cn/qt/archive/online_installers/4.6/qt-unified-linux-x64-4.6.0-online.run 2、賦…

面試實戰,問題十六,Java面試,消息隊列,如何避免消息重復消費,怎么回答

在Java面試中,關于消息隊列如何防止消息被重復消費的問題,可以從以下幾個方面進行回答,結合系統架構設計、消息隊列機制和業務邏輯處理,確保在不同場景下實現消息的冪等性。 1. 消息隊列重復消費的根本原因 消息重復消費的根本原因…

PDF轉圖片實用指南:如何批量高效轉換?

將PDF轉換為圖片后,可以更方便地在演示文稿、網頁或電子相冊中使用這些資料,以便更好地展示信息。它 是一款支持多文件批量轉換的工具,可將多個 PDF 文檔一鍵轉換為圖片格式。雖然界面為英文,但操作簡單,不影響使用。你…

走入Linux的世界:編輯器Vim

嘿,各位技術潮人!好久不見甚是想念。生活就像一場奇妙冒險,而編程就是那把超酷的萬能鑰匙。此刻,陽光灑在鍵盤上,靈感在指尖跳躍,讓我們拋開一切束縛,給平淡日子加點料,注入滿滿的pa…

PyTorch中神經網絡的模型構建

要構建自定義模型,需完成兩個核心步驟:繼承 nn.Module 類;重載 __init__ 方法(初始化)和 forward 方法(前向計算) 神經網絡的構造 初始化方法(__init__) def __init__…

QML QtCharts坐標軸系統

QtCharts是Qt框架中強大的數據可視化模塊,它提供了豐富的圖表類型和靈活的坐標軸系統,能夠滿足各種數據展示需求。本文將全面介紹QML中QtCharts的坐標軸系統,包括數值坐標軸(ValueAxis)、對數坐標軸(LogValueAxis)、分類坐標軸(CategoryAxis)…

TI 2025全國電賽猜題

本科組可能的題目方向本科組器材更側重高頻信號處理、復雜控制系統、精密測量及多設備協同,可能涉及以下題目:四旋翼飛行器相關任務題目示例:設計 “基于四旋翼的 UV 光控自主導航系統”任務要求:利用四旋翼飛行器(最大…

Python自動化運維實戰指南

什么是自動化運維定義與背景自動化運維是指利用工具和腳本自動執行傳統上需要人工操作的IT運維任務,包括但不限于服務器配置管理、軟件部署、監控告警、日志分析等日常工作。隨著互聯網業務規模的擴大,傳統手工運維方式已無法滿足快速部署、規模化管理等…

k8s的csi對接GPFS

在 Kubernetes(k8s)集群中,通過 CSI(Container Storage Interface)對接 GPFS(General Parallel File System,現為 IBM Spectrum Scale)是實現高性能共享存儲的重要方案。GPFS 作為并…

HTB賽季8靶場 - era

nmap掃描 └─$ nmap -p- --min-rate 1000 -T4 10.129.137.201 -oA nmapfullscan Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-07-27 21:19 EDT Warning: 10.129.137.201 giving up on port because retransmission cap hit (6). …

Bug貓學習史#1:面向對象

在Java編程中,掌握幾個核心概念對深入學習至關重要:類屬性建議采用包裝類以提升靈活性;建造者模式中this關鍵字能有效簡化對象構建過程;static關鍵字涉及類的加載機制;接口默認使用public修飾符并支持默認方法實現&…

優測推出HarmonyOS全場景測試服務,解鎖分布式場景應用卓越品質!

隨著HarmonyOS NEXT“純血鴻蒙”的全面商用,生態正以前所未有的速度重構終端操作系統格局。對于APP廠商而言,應用測試需要從單一設備思維向場景化服務驗證轉變。優測云服務平臺正式推出 HarmonyOS全場景測試解決方案,針對鴻蒙系統提供功能測試…