天天看點

django model和字段介紹

類型 說明
AutoField 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)。這個字段是自增主鍵的最佳替代品,後面有例子展示。

1. FileField:

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

上傳檔案字段(不能設定為主鍵)。預設情況下,該字段在HTML中表現為一個ClearableFileInput标簽。在資料庫内,我們實際儲存的是一個字元串類型,預設最大長度100,可以通過max_length參數自定義。真實的檔案是儲存在伺服器的檔案系統内的。

重要參數

upload_to

用于設定上傳位址的目錄和檔案名。如下例所示:

class MyModel(models.Model):
    # 檔案被傳至`MEDIA_ROOT/uploads`目錄,MEDIA_ROOT由你在settings檔案中設定
    upload = models.FileField(upload_to='uploads/')
    # 或者
    # 被傳到`MEDIA_ROOT/uploads/2015/01/30`目錄,增加了一個時間劃分
    upload = models.FileField(upload_to='uploads/%Y/%m/%d/')
           

Django很人性化地幫我們實作了根據日期生成目錄的方式!

upload_to參數也可以接收一個回調函數,該函數傳回具體的路徑字元串,如下例:

def user_directory_path(instance, filename):
    #檔案上傳到MEDIA_ROOT/user_<id>/<filename>目錄中
    return 'user_{0}/{1}'.format(instance.user.id, filename)

class MyModel(models.Model):
    upload = models.FileField(upload_to=user_directory_path)
           

例子中,user_directory_path這種回調函數,必須接收兩個參數,然後傳回一個Unix風格的路徑字元串。參數instace代表一個定義了FileField的模型的執行個體,說白了就是目前資料記錄。filename是原本的檔案名。

2. ImageField

用于儲存圖像檔案的字段。其基本用法和特性與FileField一樣,隻不過多了兩個屬性height和width。預設情況下,該字段在HTML中表現為一個ClearableFileInput标簽。在資料庫内,我們實際儲存的是一個字元串類型,預設最大長度100,可以通過max_length參數自定義。真實的圖檔是儲存在伺服器的檔案系統内的。

height_fiel

d參數:儲存有圖檔高度資訊的模型字段名。 width_field參數:儲存有圖檔寬度資訊的模型字段名。

使用Django的

ImageField

需要提前安裝

pillow

子產品,

pip install pillow

即可。

使用

FileField

或者

ImageField

字段的步驟:

  1. 在settings檔案中,配置

    MEDIA_ROOT

    ,作為你上傳檔案在伺服器中的基本路徑(為了性能考慮,這些檔案不會被儲存在資料庫中)。再配置個

    MEDIA_URL

    ,作為公用URL,指向上傳檔案的基本路徑。請確定Web伺服器的使用者賬号對該目錄具有寫的權限。
  2. 添加

    FileField

    或者

    ImageField

    字段到你的模型中,定義好upload_to參數,檔案最終會放在MEDIA_ROOT目錄的“upload_to”子目錄中。
  3. 所有真正被儲存在資料庫中的,隻是指向你上傳檔案路徑的字元串而已。可以通過url屬性,在Django的模闆中友善的通路這些檔案。例如,假設你有一個

    ImageField

    字段,名叫mug_shot,那麼在Django模闆的HTML檔案中,可以使用{{

    object.mug_shot.url }}來擷取該檔案。其中的object用你具體的對象名稱代替。

  4. 可以通過name和size屬性,擷取檔案的名稱和大小資訊。

安全建議

無論你如何儲存上傳的檔案,一定要注意他們的内容和格式,避免安全漏洞!務必對所有的上傳檔案進行安全檢查,確定它們不出問題!如果你不加任何檢查就盲目的讓任何人上傳檔案到你的伺服器文檔根目錄内,比如上傳了一個CGI或者PHP腳本,很可能就會被通路的使用者執行,這具有緻命的危害。

3. FilePathField

一種用來儲存檔案路徑資訊的字段。在資料表内以字元串的形式存在,預設最大長度100,可以通過max_length參數設定。

它包含有下面的一些參數:

path

:必須指定的參數。表示一個系統絕對路徑。

match

:可選參數,一個正規表達式,用于過濾檔案名。隻比對基本檔案名,不比對路徑。例如foo.*.txt$,隻比對檔案名foo23.txt,不比對bar.txt與foo23.png。

recursive

:可選參數,隻能是True或者False。預設為False。決定是否包含子目錄,也就是是否遞歸的意思。

allow_files

:可選參數,隻能是True或者False。預設為True。決定是否應該将檔案名包括在内。它和allow_folders其中,必須有一個為True。

allow_folders

: 可選參數,隻能是True或者False。預設為False。決定是否應該将目錄名包括在内。

比如:

它隻比對/home/images/foo.png,但不比對/home/images/foo/bar.png,因為預設情況,隻比對檔案名,而不管路徑是怎麼樣的。

4. UUIDField:

資料庫無法自己生成uuid,是以需要如下使用default參數:

import uuid     # Python的内置子產品
from django.db import models

class MyUUIDModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    # 其它字段
           

參考