在ORM中一個模型類對應的是資料庫中的一張表,對象對應的是資料庫中的記錄,屬性則對應的是欄位。此篇為章主要整理的是常用的欄位類型和對應的參數。

欄位類型

1.自增長欄位

# 自增長
id = models.AutoField(primary_key=True) # 系統會默認添加此欄位,無需用戶自己特地添加
id = models.BigAutoField()

自增長欄位的意思是,數據表中每增加一條記錄,這個欄位的值就會自動加1。欄位的類型默認為Int整型。下面的BigAutoField欄位可容納比較大的數,比如說十億。但是需要注意的一點是,其實我們在定義資料庫表結構的時候並不需要特地定義這樣一個欄位,因為Django會在每個表中自動添加一個id欄位,且這個欄位的類型正是自增長型。

2.二進位欄位

# 二進位
Binary = models.BinaryField()

在某些特殊情況下,我們可以用此欄位類型來插入二進位數據。

3.布爾型欄位

# 布爾型
Boolean = models.BooleanField()
NullBoolean = models.NullBooleanField()

Django提供了兩種布爾類型的欄位,上面這種不能為空,下面這種的欄位值可以為空。

4.整型欄位

# 整型
PositiveSmallInteger = models.PositiveSmallIntegerField() # 5個位元組 正數
SmallInteger = models.SmallIntegerField() # 6個位元組 正負數
PositiveInteger = models.PositiveIntegerField() # 10個位元組 正數
Integer = models.IntegerField() # 11個位元組
BigInteger = models.BigIntegerField() # 20個位元組

Django提供了5種不同的整型欄位,可以按照兩個標準來進行分類,一個是按正負數來分(Positive),一個是按數值大小來分(Small、Big)具體分類如上。

5.字元串類型

# 字元串類型
Char = models.CharField() # varchar
Text = models.TextField() # longtext

字元串類型的欄位分為兩種,上面這種對應資料庫中的varchar,需要在參數max_length中指定字元串的大小。下面這種對應資料庫中的longtext類型,無需指定字元串長度,想寫多長就寫多長。

6.時間類型

# 時間日期類型
Date = models.DateField()
DateTime = models.DateTimeField()
Duration = models.DurationField() # int, Python timedelta實現

時間類型分為三種,Date是年月日的形式,DateTime是年月日時分秒的形式,第三種表示一段時間,在數據表中是Int類型,它的底層是通過python的timedelta實現的。

7.浮點型

# 浮點型
Float = models.FloatField()
Decimal = models.DecimalField() # 11.22, 16.34

浮點型也有兩種,其中第二種Decimal比較特殊,需要在參數中指定整數有多少位,小數有多少位。

8.其他類型

# 其它欄位
Email = models.EmailField() # 郵箱
Image = models.ImageField() # 圖片
File = models.FileField() # 文件
FilePath = models.FilePathField() # 文件路徑
URL = models.URLField() # URL地址
UUID = models.UUIDField() # UID
GenericIPAddress = models.GenericIPAddressField() #IP地址,IPV4或者IPV6

另外,Django還為我們封裝了其他更加高級的欄位,從上往下依次是郵箱類型、圖片、文件、文件路徑、瀏覽器地址中輸入的URL、UUID、Ip地址(IPV6或者是IPV4)

9.關係型欄位

前面8種欄位都是獨立定義在單個表(類)中的欄位,和其他的表沒有任何關係。但在實際開發中我們不可能將我們項目中所有用到的數據都定義到一個表中,需要多個表的協同存儲。

比如說在一個博客網站中,我們可以定義一個分類目錄的表,專門用來存儲文章的分類。還可以定義一個標籤的表,專門用來存儲文章涉及到的標籤。其次就是我們的文章表,主要用來存儲除了文章相關的信息。說到這裡有人可能會有一個疑問,為什麼不將分類目錄和標籤單獨在定義一個表呢?

因為一個博客網站的文章可以有成千上百,但是分類目錄和標籤不會太多,如果在文章表中定義一個用來存儲標籤或者分類目錄的欄位,欄位里存放的是目錄和標籤的字元串,那麼可能會產生很多冗餘信息。因為可能多個文章的分類目錄標籤的欄位值都是一個字元串,這樣就會浪費很多空間。如果我們和單獨的一個分類目錄的表進行關聯,然後只在文章表的分類目錄欄位中存儲某個分類在分類表中的ID號,那麼就能夠省下來很多的空間。因為數字比字元串佔用的空間少!

因為那涉及到多個表的欄位有那些呢?主要有多對多(ManyToManyField),一對一(OneToOneField),多對一(ForeignKey)這三種關係型欄位。多對一可以理解為一篇文章只能有一個分類目錄,但是一個分類目錄可以有多篇文章,多對多可以理解為一篇文章可以有多個標籤,一個標籤可以有多篇文章對應。

# 分類目錄表(附表)
class Category(models.Model):
# 分類名
name = models.CharField(max_length=100)

# 標籤表(附表)
class Tag(models.Model):
# 標籤名
name = models.CharField(max_length=100)

# 文章表(主表)
class Article(models.Model):
# 文章標題
title = models.CharField(max_length=100)

# 分類 一對多 參數要寫上附表的類名
category = models.ForeignKey(Category)

# 標籤 多對多 參數要寫上附表的類名
tag = models.ManyToManyField(Tag)

欄位參數

在原生SQL定義數據表的時候我們常常需要給欄位設定一些參數,比如說是否為空,默認值等等。那麼在Django的模型類中我們該如何設置呢?首先,我們要知道,Django欄位的參數分如下三種情況:

1.所有欄位都具有的參數

  • 1.更改欄位名:db_colum=」 「
  • 2.設置主鍵:primary_key=True,默認為False
  • 3.給欄位設置別名(備註):verbose_name=」 「
  • 4.欄位的唯一鍵屬性:unique=True,設置之後,這個欄位的沒一條記錄的每個值是唯一的
  • 5.允許欄位為空:null=True(資料庫中欄位可以為空),blank=True(網頁表單提交內容可以為空),切記不可以將null設置為Fasle的同時還把blank設置為True。會報錯的。
  • 6.給欄位建立索引:db_index=True
  • 7.在表單中顯示說明:help_text=」 「
  • 8.欄位值不允許更改:editable=False,默認是True,可以更改。

2.個別欄位才擁有的參數

  • 1.CharField(max_length=100):欄位長度為utf8編碼的100個字元串
  • 2.DateField(unique_for_date=True):這個欄位的時間必須唯一
  • 3.DateField(auto_now=True):對這條記錄內容更新的時間
  • 4.DateField(auto_now_add=True):插入這條記錄的時間
  • 5.DecimalField(max_digits=4, decimal_places=2):前者表示整數和小數總共多少數,後者表示小數點的位數

3.關係型欄位的參數

on_delelte= 這個參數表示外鍵所關聯的對象被刪除的時候要進行什麼操作,比如說一篇文章對應一個Python的分類,但是這個分類被你不小心刪除了,那麼這篇文章的分類應該會發生什麼變化呢?主要有以下六種:

  1. CASCADE:模擬SQL語言中的ON DELETE CASCADE約束,將定義有外鍵的模型對象同時刪除!(該操作為當前Django版本的默認操作!)
  2. PROTECT:阻止上面的刪除操作,但是彈出ProtectedError異常
  3. SET_NULL:將外鍵欄位設為null,只有當欄位設置了null=True時,方可使用該值。
  4. SET_DEFAULT:將外鍵欄位設為默認值。只有當欄位設置了default參數時,方可使用。
  5. DO_NOTHING:什麼也不做。
  6. SET():設置為一個傳遞給SET()的值或者一個回調函數的返回值。注意大小寫。

4.自關聯欄位參數

需要在第一個參數中添加『self』字元串,或寫上它自己的表名(模型類名)。

推薦閱讀:

相关文章