天天看點

Django 模型(model)--1

開始學習Django,以下是一些筆記。

學習資料來源:Django學習,這個部落客寫的比較詳盡,也很細緻。

在MVC或者說MTV設計模式中,模型(M)代表對資料庫的操作。

1.模型命名:

字段命名限制:

Django不允許下面兩種字段名:

  • 與Python關鍵字沖突。這會導緻文法錯誤。例如:

    class Example(models.Model): pass = models.IntegerField() # 'pass'是Python保留字!

  • 字段名中不能有兩個以上下劃線在一起,因為兩個下劃線是Django的查詢文法。例如:

    class Example(models.Model): foo__bar = models.IntegerField() # 'foo__bar' 有兩個下劃線在一起!

2.修改模型的注意事項

這裡可以選擇在執行migrate之前,先執行

python manage.py makemigrations

讓修改動作儲存到記錄檔案中,友善github等工具的使用。

當你每次對模型進行增、删、修改時,請務必執行指令

python manage.py migrate

,讓操作實際應用到資料庫上。

如果不執行以上語句,模型的改變事展現不到資料庫上去的。

3.常用字段:

字段類型的作用:

  • 決定資料庫中對應列的資料類型(例如:INTEGER, VARCHAR, TEXT)
  • HTML中對應的表單标簽的類型,例如

    <input type=“text” />

  • 在admin背景和自動生成的表單中最小的資料驗證需求

Django内置了許多字段類型,它們都位于

django.db.models

中,例如

models.CharField

。這些類型基本滿足需求,如果還不夠,你也可以自定義字段。

類型 說明
AutoField 一個自動增加的整數類型字段。通常你不需要自己編寫它,Django會自動幫你添加字段:

id = models.AutoField(primary_key=True)

,這是一個自增字段,從1開始計數。如果你非要自己設定主鍵,那麼請務必将字段設定為

primary_key=True

。Django在一個模型中隻允許有一個自增字段,并且該字段必須為主鍵!
BigAutoField (1.10新增)64位整數類型自增字段,數字範圍更大,從1到9223372036854775807
BigIntegerField 64位整數字段(看清楚,非自增),類似IntegerField ,-9223372036854775808 到9223372036854775807。在Django的模闆表單裡展現為一個textinput标簽。
BinaryField 二進制資料類型。使用受限,少用。
BooleanField 布爾值類型。預設值是None。在HTML表單中展現為CheckboxInput标簽。如果要接收null值,請使用NullBooleanField。
CharField 字元串類型。必須接收一個max_length參數,表示字元串長度不能超過該值。預設的表單标簽是input text。最常用的filed,沒有之一!
CommaSeparatedIntegerField 逗号分隔的整數類型。必須接收一個max_length參數。常用于表示較大的金額數目,例如1,000,000元。
DateField

class DateField(auto_now=False, auto_now_add=False, **options)

日期類型。一個Python中的datetime.date的執行個體。在HTML中表現為TextInput标簽。在admin背景中,Django會幫你自動添加一個JS的月曆表和一個“Today”快捷方式,以及附加的日期合法性驗證。兩個重要參數:(參數互斥,不能共存)  

auto_now

:每當對象被儲存時将字段設為目前日期,常用于儲存最後修改時間。

auto_now_add

:每當對象被建立時,設為目前日期,常用于儲存建立日期(注意,它是不可修改的)。設定上面兩個參數就相當于給field添加了

editable=False

blank=True

屬性。如果想具有修改屬性,請用default參數。例子:

pub_time = models.DateField(auto_now_add=True)

,自動添加釋出時間。
DateTimeField 日期時間類型。Python的datetime.datetime的執行個體。與DateField相比就是多了小時、分和秒的顯示,其它功能、參數、用法、預設值等等都一樣。
DecimalField 固定精度的十進制小數。相當于Python的Decimal執行個體,必須提供兩個指定的參數!參數

max_digits

:最大的位數,必須大于或等于小數點位數 。

decimal_places

:小數點位數,精度。 當

localize=False

時,它在HTML表現為NumberInput标簽,否則是text類型。例子:儲存最大不超過999,帶有2位小數位精度的數,定義如下:

models.DecimalField(..., max_digits=5, decimal_places=2)

DurationField 持續時間類型。存儲一定期間的時間長度。類似Python中的timedelta。在不同的資料庫實作中有不同的表示方法。常用于進行時間之間的加減運算。但是小心了,這裡有坑,PostgreSQL等資料庫之間有相容性問題!
EmailField 郵箱類型,預設max_length最大長度254位。使用這個字段的好處是,可以使用DJango内置的EmailValidator進行郵箱位址合法性驗證。
FileField

class FileField(upload_to=None, max_length=100, **options)

上傳檔案類型,後面單獨介紹。
FilePathField 檔案路徑類型,後面單獨介紹
FloatField 浮點數類型,參考整數類型
ImageField 圖像類型,後面單獨介紹。
IntegerField 整數類型,最常用的字段之一。取值範圍-2147483648到2147483647。在HTML中表現為NumberInput标簽。
GenericIPAddressField

class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options)[source]

,IPV4或者IPV6位址,字元串形式,例如

192.0.2.30

或者

2a02:42fe::4

在HTML中表現為TextInput标簽。參數

protocol

預設值為‘both’,可選‘IPv4’或者‘IPv6’,表示你的IP位址類型。
NullBooleanField 類似布爾字段,隻不過額外允許

NULL

作為選項之一。
PositiveIntegerField 正整數字段,包含0,最大2147483647。
PositiveSmallIntegerField 較小的正整數字段,從0到32767。
SlugField slug是一個新聞行業的術語。一個slug就是一個某種東西的簡短标簽,包含字母、數字、下劃線或者連接配接線,通常用于URLs中。可以設定max_length參數,預設為50。
SmallIntegerField 小整數,包含-32768到32767。
TextField 大量文本内容,在HTML中表現為Textarea标簽,最常用的字段類型之一!如果你為它設定一個max_length參數,那麼在前端頁面中會受到輸入字元數量限制,然而在模型和資料庫層面卻不受影響。隻有CharField才能同時作用于兩者。
TimeField 時間字段,Python中datetime.time的執行個體。接收同DateField一樣的參數,隻作用于小時、分和秒。
URLField 一個用于儲存URL位址的字元串類型,預設最大長度200。
UUIDField 用于儲存通用唯一識别碼(Universally Unique Identifier)的字段。使用Python的UUID類。在PostgreSQL資料庫中儲存為uuid類型,其它資料庫中為char(32)。這個字段是自增主鍵的最佳替代品,後面有例子展示。