這篇筆記介紹的 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筆記,
如果想獲取更多相關文章,可掃碼關注閱讀:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/547620.html
標籤:Python
上一篇:解決python opencv2在pycharm中沒有代碼提示的問題 (不修改包檔案)
下一篇:linux使用匯總
