今天介紹一下django開發中,定義模型時用到的相關字段類型和字段選項。
先說說常用的字段類型:
1) AutoField: 自增字段類型,當自定義自增類型的id時,可以使用此類型;
2) BigAutoField: 64位的整數自增類型;
3) BigIntegerField: 64位的整數類類型;
4) BinrayField: 字節類型的二進制數據;
5) BooleanField: 布爾類型;
6) CharField: 字符串類型,使用時必須指定max_lenth這個參數;
7) DateField: 日期類型,在python中datetime.date的實例就相當於該類型。該類型有兩個字段選項auto_now和auto_now_add需要說一下。在django官方文檔中的說明中,auto_now表示當對象被保存后,該字段會自動設置為當前時間,適用於需要保存對象的最后修改時間的場景。auto_now_add表示當對象第一次被創建后,該字段會自動設置為當前時間,適用於保存對象創建時間的場景。
8) DateTimeField: 時間類型,在python中datetime.datetime的實例就相當於該類型。同樣的,這個字段中也有auto_now和aito_now_add這兩個參數;
9) TimeField: 時間類型,python中datetime.time的實例可以表示此類型,
10) DecimalField: 數字類型,python中的Decimal實例就相當於此類型。有兩個必須的參數,max_digits表示數字整數部分和小數部
分共有多少位,decimal_places表示精度,即小數部分的位數
test_decimal = models.DecimalField(max_digits=5, decimal_places=2) # 3位整數,2位小數
11) DurationField: 存儲時間段的類型,即表示兩個時間的差值,在python中可以用timedelta表示;
12) EmailField: 一個字符串,但是會使用EmailValidator驗證form中輸入的字符串是否符合郵件的格式;
13) FileField: 文件上傳類型的字段,必須要有upload_to這個參數,上傳的文件會保存在upload_to指定的路徑中
test_file1 = models.FileField(upload_to='uploads/') # 上傳的文件保存到uploads中 test_file2 = models.FileField(upload_to='uploads/%Y/%m/%d') # 上傳的文件保存到uploads/2018/08/18中
其中,upload_to的值還可以是一個回調函數:
def func_file(instance, filename): return 'user_{0}/{1}'.format(instance.user.id, filename)test_file3 = models.FileField(upload_to=func_file)
14) ImageField: 圖片類型的字段,可以用在使用頭像的場景中;與FileField一樣,它也有upload_to參數,需要指定一個上傳的路徑。使用該字段時,項目中需要安裝Pillow庫。ImageField的實例是作為varchar類型保存到數據庫中的,默認字符串的最大長度是100,但是可以使用max_length參數指定最大長度。
15) TextField: 文本類型的字段,對於超出CharField類型存儲范圍的數據,可以定義為該類型;
16) UUIDField: 使用python中UUID類生成該字段的值,生成一個通用唯一的標識符,該類型可以代替自增id做主鍵
user_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
其中,default參數可以指定,uuid4是uuid的一個版本,即uuid的生成方式,還有其它的版本。
17) FloatField: 浮點類型,用python中的float實例表示;
18) IntegerField: 整數類型。
下面說說常用的字段選項:
1)default: 該參數可以指定字段的默認值,一般直接指定默認值即可;但是,該參數的值還可以是一個函數名,可用於訂單號等特殊字符串的生成;用法如下:
def generate_order_id(): """ 此處可以編寫生成訂單號的邏輯 """ ......order_id = models.CharField(max_length=32, default=generate_order_id)
通過以上代碼,每創建模型中的一條數據時,order_id就會根據你編寫的邏輯自動生成,這樣大大增加了字段值的靈活性;
2)primary_key: 如果參數值為True,表示指定該字段是主鍵;當模型中沒有使用這個參數時,django會自動添加一個int型的自增id作為主鍵;
3)null: 如果參數值為True,該字段在數據庫中的值是NULL,該參數默認值是False;
4)blank: 如果參數值是True,表示這個字段值在前端頁面的表單中允許填空值,注意與null的區別;
5)auto_now和auto_now_add在上面講解過,這里不再說明了;
6)choices: 該參數的值是一個可迭代的對象,看一下例子:
class UserModel(models.Model): user_type = ( (1, "中學生"), (2, "大學生"), (3, "研究生"), ) user_type = models.IntegerField(choices=user_type)
上面的代碼中,choices的值是一個元祖(當然也可以是列表),在數據庫中存儲的形式是1、2、3,但是在前端表單中顯示的結果是中學生、大學生、研究生;一些表示類型、愛好等具有分類意義的字段時可以使用這個參數;
7)help_text: 顯示在頁面表單中的一段說明性文字,可以用於對該字段的解釋說明;
8)verbose_name: 給字段指定一個更詳細的名字;ForeignKey、ManyToManyField 和OneToOneField,字段默認的verbose_name值就是字段的名稱,如果顯式指定,只需寫在第一個位置即可,如:
user = models.CharField("user_name", max_length=32)
user字段的verbose_name就是user_name;
當字段是ForeignKey、ManyToManyField或者OneToOneField類型時,想使用這個參數必須加上verbose_name,如:
user = models.ForeignKey(UserModel, to_field="user_id", verbose_name="user_name")
因為當字段是ForeignKey、ManyToManyField或者OneToOneField這三種類型時,第一個參數必須是關聯的模型類;
9)unique: 如果值該參數為True,則數據庫中這個字段的值必須唯一,且不能為空;
10)db_index: 如果該字段值為True,則在數據庫中,將會在該字段上創建索引。
關於Field的字段類型和參數就先講到這里。如果錯誤之處,歡迎交流指正!
原文地址:https://segmentfault.com/a/1190000016151866