# 第四節:模型常用字段
# 模型常用屬性
## 常用字段:
在`Django`中,定義了一些`Field`來與數據庫表中的字段類型來進行映射。以下將介紹那些常用的字段類型。
### AutoField:
映射到數據庫中是`int`類型,可以有自動增長的特性。一般不需要使用這個類型,如果不指定主鍵,那么模型會自動的生成一個叫做`id`的自動增長的主鍵。如果你想指定一個其他名字的并且具有自動增長的主鍵,使用`AutoField`也是可以的。
### BigAutoField:
64位的整形,類似于`AutoField`,只不過是產生的數據的范圍是從`1-9223372036854775807`。
### BooleanField:
在模型層面接收的是`True/False`。在數據庫層面是`tinyint`類型。如果沒有指定默認值,默認值是`None`。
### CharField:
在數據庫層面是`varchar`類型。在`Python`層面就是普通的字符串。這個類型在使用的時候必須要指定最大的長度,也即必須要傳遞`max_length`這個關鍵字參數進去。
### DateField:
日期類型。在`Python`中是`datetime.date`類型,可以記錄年月日。在映射到數據庫中也是`date`類型。使用這個`Field`可以傳遞以下幾個參數:
1. `auto_now`:在每次這個數據保存的時候,都使用當前的時間。比如作為一個記錄修改日期的字段,可以將這個屬性設置為`True`。
2. `auto_now_add`:在每次數據第一次被添加進去的時候,都使用當前的時間。比如作為一個記錄第一次入庫的字段,可以將這個屬性設置為`True`。
### DateTimeField:
日期時間類型,類似于`DateField`。不僅僅可以存儲日期,還可以存儲時間。映射到數據庫中是`datetime`類型。這個`Field`也可以使用`auto_now`和`auto_now_add`兩個屬性。
### TimeField:
時間類型。在數據庫中是`time`類型。在`Python`中是`datetime.time`類型。
### EmailField:
類似于`CharField`。在數據庫底層也是一個`varchar`類型。最大長度是254個字符。
### FileField:
用來存儲文件的。這個請參考后面的文件上傳章節部分。
### ImageField:
用來存儲圖片文件的。這個請參考后面的圖片上傳章節部分。
### FloatField:
浮點類型。映射到數據庫中是`float`類型。
### IntegerField:
整形。值的區間是`-2147483648——2147483647`。
### BigIntegerField:
大整形。值的區間是`-9223372036854775808——9223372036854775807`。
### PositiveIntegerField:
正整形。值的區間是`0——2147483647`。
### SmallIntegerField:
小整形。值的區間是`-32768——32767`。
### PositiveSmallIntegerField:
正小整形。值的區間是`0——32767`。
### TextField:
大量的文本類型。映射到數據庫中是longtext類型。
### UUIDField:
只能存儲`uuid`格式的字符串。`uuid`是一個32位的全球唯一的字符串,一般用來作為主鍵。
### URLField:
類似于`CharField`,只不過只能用來存儲`url`格式的字符串。并且默認的`max_length`是200。
- - - - - -
## Field的常用參數:
### null:
如果設置為`True`,`Django`將會在映射表的時候指定是否為空。默認是為`False`。在使用字符串相關的`Field`(CharField/TextField)的時候,官方推薦盡量不要使用這個參數,也就是保持默認值`False`。因為`Django`在處理字符串相關的`Field`的時候,即使這個`Field`的`null=False`,如果你沒有給這個`Field`傳遞任何值,那么`Django`也會使用一個空的字符串`""`來作為默認值存儲進去。因此如果再使用`null=True`,`Django`會產生兩種空值的情形(NULL或者空字符串)。如果想要在表單驗證的時候允許這個字符串為空,那么建議使用`blank=True`。如果你的`Field`是`BooleanField`,那么對應的可空的字段則為`NullBooleanField`。
### blank:
標識這個字段在表單驗證的時候是否可以為空。默認是`False`。
這個和`null`是有區別的,`null`是一個純數據庫級別的。而`blank`是表單驗證級別的。
### db\_column:
這個字段在數據庫中的名字。如果沒有設置這個參數,那么將會使用模型中屬性的名字。
### default:
默認值。可以為一個值,或者是一個函數,但是不支持`lambda`表達式。并且不支持列表/字典/集合等可變的數據結構。
### primary\_key:
是否為主鍵。默認是`False`。
### unique:
在表中這個字段的值是否唯一。一般是設置手機號碼/郵箱等。
更多`Field`參數請參考官方文檔:<https://docs.djangoproject.com/zh-hans/2.0/ref/models/fields/>
## 模型中`Meta`配置:
對于一些模型級別的配置。我們可以在模型中定義一個類,叫做`Meta`。然后在這個類中添加一些類屬性來控制模型的作用。比如我們想要在數據庫映射的時候使用自己指定的表名,而不是使用模型的名稱。那么我們可以在`Meta`類中添加一個`db_table`的屬性。示例代碼如下:
```
<pre class="calibre12">```
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Book</span><span class="hljs-params">(models.Model)</span>:</span>
name = models.CharField(max_length=<span class="hljs-params">20</span>,null=<span class="hljs-keyword">False</span>)
desc = models.CharField(max_length=<span class="hljs-params">100</span>,name=<span class="hljs-string">'description'</span>,db_column=<span class="hljs-string">"description1"</span>)
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Meta</span>:</span>
db_table = <span class="hljs-string">'book_model'</span>
```
```
以下將對`Meta`類中的一些常用配置進行解釋。
### db\_table:
這個模型映射到數據庫中的表名。如果沒有指定這個參數,那么在映射的時候將會使用模型名來作為默認的表名。
### ordering:
設置在提取數據的排序方式。后面章節會講到如何查找數據。比如我想在查找數據的時候根據添加的時間排序,那么示例代碼如下:
```
<pre class="calibre12">```
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Book</span><span class="hljs-params">(models.Model)</span>:</span>
name = models.CharField(max_length=<span class="hljs-params">20</span>,null=<span class="hljs-keyword">False</span>)
desc = models.CharField(max_length=<span class="hljs-params">100</span>,name=<span class="hljs-string">'description'</span>,db_column=<span class="hljs-string">"description1"</span>)
pub_date = models.DateTimeField(auto_now_add=<span class="hljs-keyword">True</span>)
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Meta</span>:</span>
db_table = <span class="hljs-string">'book_model'</span>
ordering = [<span class="hljs-string">'pub_date'</span>]
```
```
更多的配置后面會慢慢介紹到。 官方文檔:<https://docs.djangoproject.com/en/2.0/ref/models/options/>
- Introduction
- 第一章:學前準備
- 第一節:虛擬環境
- 第二節:準備工作
- 第三節:Django介紹
- 第四節:URL組成部分
- 第二章:URL與視圖
- 第一節:第一個Django項目
- 第二節:視圖與URL分發器
- 第三章:模板
- 第一節:模板介紹
- 第二節:模板變量
- 第三節:常用標簽
- 第四節:常用過濾器
- 第五節:自定義過濾器
- 第七節:模版結構優化
- 第八節:加載靜態文件
- 第四章:數據庫
- 第一節:MySQL相關軟件
- 第二節:數據庫操作
- 第三節:ORM模型
- 第四節:模型常用字段
- 第五節:外鍵和表關系
- 第六節:增刪改查操作
- 第七節:查詢操作
- 第八節:QuerySet API
- 第九節:ORM模型遷移
- 第十節:ORM作業
- 第十一節:ORM作業參考答案
- 第十二節:Pycharm連接數據庫
- 第五章:視圖高級
- 第一節:限制請求method
- 第二節:頁面重定向
- 第三節:HttpRequest對象
- 第四節:HttpResponse對象
- 第五節:生成CSV文件
- 第六節:類視圖
- 第七節:錯誤處理
- 第六章:表單
- 第一節:表單概述
- 第二節:用表單驗證數據
- 第三節:ModelForm
- 第四節:文件上傳
- 第七章:cookie和session
- 第八章:上下文處理器和中間件
- 第一節:上下文處理器
- 第二節:中間件
- 第九章:安全
- 第一節:CSRF攻擊
- 第二節:XSS攻擊
- 第三節:點擊劫持攻擊
- 第四節:SQL注入
- 第十章:信號
- 第一節:什么是信號
- 第十一章:驗證和授權
- 第一節:概述
- 第二節:用戶對象
- 第三節:權限和分組
- 第十二章:Admin系統
- 第十三章:Django的緩存
- 第十四章:memcached
- 第十五章:Redis