一、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)
目錄大致如下:
- null=True/False
- default
- blank=True/False
- primary_key
- unique
- verbose_name
- db_index
- auto_now
- auto_now_add
- 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筆記。
如果想獲取更多相關文章,可掃碼關註閱讀: