1. 程式人生 > >django開發之model篇-Field型別講解

django開發之model篇-Field型別講解

今天介紹一下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