Django筆記四之欄位屬性

来源:https://www.cnblogs.com/hunterxiong/archive/2023/03/21/17241947.html
-Advertisement-
Play Games

一、PHP簡介 Hypertext Preprocessor,又稱為超文本預處理器(HTML為超文本標簽語言),就是我們所說的PHP。它是一種糅雜百家的後臺語言,在PHP中,可以見到C、Java等語言的寫法和它自創的一些寫法,這也就是為什麼說學過其他語言的人會比較容易接受PHP。 PHP開發時需要去 ...


這篇筆記介紹的 field options,也就是 欄位的選項屬性。

首先,關於 model,是資料庫與 python 代碼里的一個映射關係,每一個 model 是django.db.models.Model 的一個子類。

model 里每一個屬性值(即欄位)代表資料庫的欄位,通過 定義 models.py 里的 class,可以自動生成資料庫里的表和欄位,比如之前的 Question。

主鍵 id 欄位如果不手動設置都會預設創建。

比如下麵這個 model,我們將以此為例介紹各個欄位的屬性值:

class Question(models.Model):
    SiZES = [
        ('S', 'small'),
        ('M', 'medium'),
        ("L", 'large'),
    ]
    question_text = models.CharField(verbose_name="問題文字", max_length=200, help_text="question_text")
    pub_date = models.DateTimeField('日期')
    test_blank_char = models.CharField(blank=True, max_length=100)
    size = models.CharField(max_length=10, choices=SiZES)

目錄大致如下:

  1. null=True/False
  2. default
  3. blank=True/False
  4. primary_key
  5. unique
  6. verbose_name
  7. db_index
  8. auto_now
  9. auto_now_add
  10. choices

1、null=True/False

是否允許欄位在資料庫的欄位為 null。

這個欄位一般可以和下麵的 default 預設值配合使用

2、default

欄位的預設值

有時候創建一條數據的時候,指定了其他欄位的值,該欄位不指定,那麼系統就會給這個欄位賦值為 default 的值,可以是 任意值,比如整型,字元型,日期,以及 None。
比如下麵的model:

class Question(models.Model):
	name = models.CharField(max_length=20, default='')
	pub_date = models.DateField()	

創建一條數據:

Question.objects.create(pub_date="2022-01-01")

創建數據的時候沒有指定 name 的值,而我們設置了 default 為 空字元串,那麼系統創建這條數據的時候,就會預設為 該欄位賦值為 ''

而如果我們設置了 default=None,表示預設為 null(資料庫的空值),系統會報錯,因為欄位一般預設是不允許為空的,所以我們需要和 null=True 配合使用,示例如下:

class Question(models.Model):
	name = models.CharField(max_length=20, default=None, null=True)
	pub_date = models.DateField()	

那麼當我們創建一條數據的時候,如果不指定 name 的值,name 欄位在資料庫中就會預設為 null 了。

3、blank=True/False

blank 是空白,表示空字元串,欄位是否允許為空字元串

4、primary_key

是否為主鍵

因為我們創建表的時候,比如上面那個 Question,一般不設置主鍵 id,系統為自動預設為我們創建一個主鍵為 id 的自增的整型數據。

5、unique

唯一約束

設置為 unique=True 後,該表會為該欄位中建立一個唯一索引,該欄位數據在該表中就只能是唯一的了,不可創建相同內容的數據了,否則會報錯。

class Question(models.Model):
	name = models.CharField(max_length=20, unique=True)
	pub_date = models.DateField()	

比如我們創建了一條數據,name 的值為 'hunter',然後再創建一條 name 為 'hunter' 的數據,系統就會報錯。

6、verbose_name

name = models.CharField(max_length=20, default=None, null=True, verbose_name='名稱')

欄位註釋,除了可用於用戶的查看理解欄位含義,還可在 admin 頁面數據該欄位的標題顯示(admin後臺管理頁面後續會開一篇筆記介紹)

7、db_index

索引

設置欄位的這個參數為 True,然後運行 makemigrations 和 migrate 會為資料庫的該欄位創建索引

name = models.CharField(max_length=20, default=None, null=True, verbose_name='名稱', db_index=True)

8、auto_now

常用於日期欄位,每次更改該數據行的欄位的內容時,該欄位會自動更新為當前時間,常用於 updated_time 欄位

示例:

updated_time = models.DateTimeField(auto_now=True)

9、auto_now_add

常用於日期欄位,每次創建該數據行數據之後,該欄位會被自動填入當前時間,且之後更改數據時不會變化,常用於 created_time 欄位

示例:

created_time = models.DateTimeField(auto_now_add=True)

10、choices

欄位可選值

常用於某個欄位的只能選擇特定的幾個值的情況下,比如狀態為 成功,失敗,待處理這種。

下麵是一個使用示例:

class Question(models.Model):
    SiZES = [
        ('S', 'small'),
        ('M', 'medium'),
        ('L', 'large'),
    ]
    question_text = models.CharField(verbose_name="問題文字", max_length=200)
    pub_date = models.DateTimeField('日期')
    test_blank_char = models.CharField(blank=True, max_length=100)
    size = models.CharField(max_length=10, choices=SiZES)

系統在保存的時候 使用的是 choices 中每一個元素的第一個值,也就是 SIZES 里的 ’S’ ‘M’, ‘L’

如果在項目中想要獲取該欄位對應的全稱,可以使用 get_field_display() 方法,其中,field 為我們定義的欄位名

比如在上面的 model 里,是 get_size_display()

官方的做法是 在 model 的類裡面,定義一個 CHOICES,然後定義對於每個值定義一個合適的常量

以下是官方的一個示例:

class Student(models.Model):
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    SENIOR = 'SR'
    GRADUATE = 'GR'
    YEAR_IN_SCHOOL_CHOICES = [
        (FRESHMAN, 'Freshman'),
        (SOPHOMORE, 'Sophomore'),
        (JUNIOR, 'Junior'),
        (SENIOR, 'Senior'),
        (GRADUATE, 'Graduate'),
    ]
    year_in_school = models.CharField(
        max_length=2,
        choices=YEAR_IN_SCHOOL_CHOICES,
        default=FRESHMAN,
    )

以上就是本篇筆記全部內容,主要介紹的是欄位里的選項,下一篇筆記將介紹欄位的類型,比如 IntegerField, CharField等等

原文鏈接:Django筆記四之欄位選項

本文首發於本人微信公眾號:Django筆記。

如果想獲取更多相關文章,可掃碼關註閱讀:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 橋接模式(Bridge Pattern)是一種結構型設計模式,用於將一個大類或一系列緊密相關的類拆分為抽象和實現兩個獨立的層次結構,從而能夠更好地組合和擴展這些類。 在前端開發中,橋接模式通常用於處理 UI 組件的複雜性,將組件的抽象與實現分離,使得它們能夠獨立地變化。通過橋接模式,我們可以讓組件的 ...
  • 概述 KCP協議結合了TCP和UDP協議的特點,是一個快速可靠的協議。 引述官方介紹: KCP是一個快速可靠協議,能以比 TCP浪費10%-20%的帶寬的代價,換取平均延遲降低 30%-40%,且最大延遲降低三倍的傳輸效果。純演算法實現,並不負責底層協議(如UDP)的收發,需要使用者自己定義下層數據的 ...
  • TCP/IP協議中有兩個具有代表性的傳輸層協議,分別是TCP協議和UDP協議。TCP協議全稱傳輸控制協議,是一種面向連接的、可靠的、基於位元組流的傳輸層通信協議。UDP協議全稱用戶數據報協議,是 TCP/IP協議模型傳輸層的無連接協議,它既不建立連接,也不檢查目標電腦是否已準備好接收,該協議只是將數... ...
  • 複習 Vue 1.vue的使用步驟: (1)導入vue.js (2)創建除body以外最大的div標簽,給定id值 (3)創建vue對象 new Vue({ "el":"#app", "data":{}, //定義變數 "methods":{}, //定義方法 "beforeCreate":func ...
  • Mybatis 環境: JDK1.8 Mysql maven IDEA 回顧: JDBC Mysql Java基礎 Maven Junit SSM框架:配置文件的。最好的方式:看官網文檔; 1、簡介 1.1、什麼是Mybatis MyBatis 是一款優秀的持久層框架 它支持自定義 SQL、存儲過程 ...
  • 攔截器&文件上傳 1.攔截器-Interceptor 1.1攔截器概念 攔截器 攔截器(Interceptor):是一種動態攔截方法調用的機制,在SpringMVC中動態攔截控制器方法的執行。在SpringBoot中,攔截器是開發的常用手段,要用來登錄驗證、性能檢查、日誌記錄等 (1)SpringB ...
  • 1 C++初識 1.1 變數 作用:給一段指定的記憶體空間起名,方便操作這段記憶體 **註意:**C++在創建變數時,必須給變數一個初始值,否則會報錯 1.2 常量 作用:用於記錄程式中不可更改的數據 C++定義常量兩種方式 #define 巨集常量: #define 常量名 常量值 通常在文件上方定義, ...
  • 以下是一個基於C語言和Win32API的記憶體掃描器的實現代碼 首先定義一個結構體MEMBLOCK,用來存儲記憶體塊的信息 點擊查看代碼 typedef struct _MEMBLOCK { HANDLE hProcess; //進程句柄 PVOID addr; //記憶體塊地址 int size; // ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...