django第一次(轉自劉江大佬)

下面的模型定義了一個「人」,它具備first_namelast_name字段:前端

from django.db import models class Person(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) 

每個字段都是一個類屬性,每一個類屬性表示數據表中的一個列。python

上面的代碼,至關於下面的原生SQL語句:git

CREATE TABLE myapp_person ( "id" serial NOT NULL PRIMARY KEY, "first_name" varchar(30) NOT NULL, "last_name" varchar(30) NOT NULL ); 

注意:github

  • 表名myapp_person由Django自動生成,默認格式爲「項目名稱+下劃線+小寫類名」,你能夠重寫這個規則。
  • Django默認自動建立自增主鍵id,固然,你也能夠本身指定主鍵。
  • 上面的SQL語句基於PostgreSQL語法。

一般,咱們會將模型編寫在其所屬app下的models.py文件中,沒有特別需求時,請堅持這個原則,不要本身給本身添加麻煩。數據庫

建立了模型以後,在使用它以前,你須要先在settings文件中的INSTALLED_APPS 處,註冊models.py文件所在的myapp。看清楚了,是註冊app,不是模型,也不是models.py。若是你之前寫過模型,可能已經作過這一步工做,可跳過。django

INSTALLED_APPS = [
#...
'myapp',
#...
]

當你每次對模型進行增、刪、修改時,請務必執行命令python manage.py migrate,讓操做實際應用到數據庫上。這裏能夠選擇在執行migrate以前,先執行python manage.py makemigrations讓修改動做保存到記錄文件中,方便github等工具的使用。app

模型字段fields

字段是模型中最重要的內容之一,也是惟一必須的部分。字段在Python中表現爲一個類屬性,體現了數據表中的一個列。請不要使用cleansavedelete等Django內置的模型API名字,防止命名衝突。下面是一個展現,注意字段的寫法:工具

from django.db import models class Musician(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) instrument = models.CharField(max_length=100) class Album(models.Model): artist = models.ForeignKey(Musician, on_delete=models.CASCADE) name = models.CharField(max_length=100) release_date = models.DateField() num_stars = models.IntegerField() 

字段命名約束:ui

Django不容許下面兩種字段名:spa

  • 與Python關鍵字衝突。這會致使語法錯誤。例如:

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

  • 字段名中不能有兩個以上下劃線在一塊兒,由於兩個下劃線是Django的查詢語法。例如:

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

因爲你能夠自定義表名、列名,上面的規則可能被繞開,可是請養成良好的習慣,必定不要那麼起名。

SQL語言的join、where和select等保留字能夠做爲字段名,由於Django對它們都進行了轉義。

經常使用字段類型

字段類型的做用:

  • 決定數據庫中對應列的數據類型(例如:INTEGER, VARCHAR, TEXT)
  • HTML中對應的表單標籤的類型,例如<input type=「text」 />
  • 在admin後臺和自動生成的表單中最小的數據驗證需求

Django內置了許多字段類型,它們都位於django.db.models中,例如models.CharField。這些類型基本知足需求,若是還不夠,你也能夠自定義字段。

下表列出了全部Django內置的字段類型,但不包括關係字段類型(字段名採用駝峯命名法,初學者請必定要注意):

類型 說明
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=Falseblank=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)。這個字段是自增主鍵的最佳替代品,後面有例子展現。
相關文章
相關標籤/搜索