字段的參數 -- Django從入門到精通系列教程

該系列教程系我的原創,並完整發布在我的官網劉江的博客和教程

全部轉載本文者,需在頂部顯著位置註明原做者及www.liujiangblog.com官網地址。


全部的模型字段均可以接收必定數量的參數,好比CharField至少須要一個max_length參數。下面的這些參數是全部字段均可以使用的,而且是可選的。python

null

該值爲True時,Django在數據庫用NULL保存空值。默認值爲False。對於保存字符串類型數據的字段,請儘可能避免將此參數設爲True,那樣會致使兩種‘沒有數據’的狀況,一種是NULL,另外一種是‘空字符串’。數據庫

blank

True時,字段能夠爲空。默認False。和null參數不一樣的是,null是純數據庫層面的,而blank是驗證相關的,它與表單驗證是否容許輸入框內爲空有關,與數據庫無關。因此要當心一個null爲False,blank爲True的字段接收到一個空值可能會出bug或異常。django

choices

用於頁面上的選擇框標籤,須要先提供一個二維的二元元組,第一個元素表示存在數據庫內真實的值,第二個表示頁面上顯示的具體內容。在瀏覽器頁面上將顯示第二個元素的值。例如:瀏覽器

YEAR_IN_SCHOOL_CHOICES = (
        ('FR', 'Freshman'),
        ('SO', 'Sophomore'),
        ('JR', 'Junior'),
        ('SR', 'Senior'),
        ('GR', 'Graduate'),
    )

通常來講,最好將選項定義在類裏,並取一個直觀的名字,以下所示:函數

from django.db import models

class Student(models.Model):
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    SENIOR = 'SR'
    YEAR_IN_SCHOOL_CHOICES = (
        (FRESHMAN, 'Freshman'),
        (SOPHOMORE, 'Sophomore'),
        (JUNIOR, 'Junior'),
        (SENIOR, 'Senior'),
    )
    year_in_school = models.CharField(
        max_length=2,
        choices=YEAR_IN_SCHOOL_CHOICES,
        default=FRESHMAN,
    )

    def is_upperclass(self):
        return self.year_in_school in (self.JUNIOR, self.SENIOR)

要獲取一個choices的第二元素的值,可使用get_FOO_display()方法,其中的FOO用字段名代替。對於下面的例子:ui

from django.db import models

class Person(models.Model):
    SHIRT_SIZES = (
    ('S', 'Small'),
    ('M', 'Medium'),
    ('L', 'Large'),
    )
    name = models.CharField(max_length=60)
    shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)

使用方法:spa

>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'

db_column

該參數用於定義當前字段在數據表內的列名。若是未指定,Django將使用字段名做爲列名。code

db_index

該參數接收布爾值。若是爲True,數據庫將爲該字段建立索引。orm

db_tablespace

用於字段索引的數據庫表空間的名字,前提是當前字段設置了索引。默認值爲工程的DEFAULT_INDEX_TABLESPACE設置。若是使用的數據庫不支持表空間,該參數會被忽略。對象

default

字段的默認值,能夠是值或者一個可調用對象。若是是可調用對象,那麼每次建立新對象時都會調用。設置的默認值不能是一個可變對象,好比列表、集合等等。lambda匿名函數也不可用於default的調用對象,由於匿名函數不能被migrations序列化。

注意:在某種緣由不明的狀況下將default設置爲None,可能會引起intergyerror:not null constraint failed,即非空約束失敗異常,致使python manage.py migrate失敗,此時可將None改成False或其它的值,只要不是None就行。

editable

若是設爲False,那麼當前字段將不會在admin後臺或者其它的ModelForm表單中顯示,同時還會被模型驗證功能跳過。參數默認值爲True。

error_messages

用於自定義錯誤信息。參數接收字典類型的值。字典的鍵能夠是nullblankinvalidinvalid_choiceuniqueunique_for_date其中的一個。

help_text

額外顯示在表單部件上的幫助文本。使用時請注意轉義爲純文本,防止腳本攻擊。

primary_key

若是你沒有給模型的任何字段設置這個參數爲True,Django將自動建立一個AutoField自增字段,名爲‘id’,並設置爲主鍵。也就是id = models.AutoField(primary_key=True)

若是你爲某個字段設置了primary_key=True,則當前字段變爲主鍵,並關閉Django自動生成id主鍵的功能。

primary_key=True隱含null=Falseunique=True的意思。一個模型中只能有一個主鍵字段!

另外,主鍵字段不可修改,若是你給某個對象的主鍵賦個新值其實是建立一個新對象,並不會修改原來的對象。

from django.db import models
class Fruit(models.Model):
    name = models.CharField(max_length=100, primary_key=True)
###############    
>>> fruit = Fruit.objects.create(name='Apple')
>>> fruit.name = 'Pear'
>>> fruit.save()
>>> Fruit.objects.values_list('name', flat=True)
['Apple', 'Pear']

unique

設爲True時,在整個數據表內該字段的數據不可重複。

注意:對於ManyToManyField和OneToOneField關係類型,該參數無效。

注意: 當unique=True時,db_index參數無須設置,由於unqiue隱含了索引。

注意:自1.11版本後,unique參數能夠用於FileField字段。

unique_for_date

日期惟一。可能不太好理解。舉個栗子,若是你有一個名叫title的字段,並設置了參數unique_for_date="pub_date",那麼Django將不容許有兩個模型對象具有一樣的title和pub_date。有點相似聯合約束。

unique_for_month

同上,只是月份惟一。

unique_for_year

同上,只是年份惟一。

verbose_name

爲字段設置一我的類可讀,更加直觀的別名。

對於每個字段類型,除了ForeignKeyManyToManyFieldOneToOneField這三個特殊的關係類型,其第一可選位置參數都是verbose_name。若是沒指定這個參數,Django會利用字段的屬性名自動建立它,並將下劃線轉換爲空格。

下面這個例子的verbose name是"person’s first name":

first_name = models.CharField("person's first name", max_length=30)

下面這個例子的verbose name是"first name":

first_name = models.CharField(max_length=30)

對於外鍵、多對多和一對一字字段,因爲第一個參數須要用來指定關聯的模型,所以必須用關鍵字參數verbose_name來明確指定。以下:

poll = models.ForeignKey(
    Poll,
    on_delete=models.CASCADE,
    verbose_name="the related poll",
    )
sites = models.ManyToManyField(Site, verbose_name="list of sites")
    place = models.OneToOneField(
    Place,
    on_delete=models.CASCADE,
    verbose_name="related place",
)

另外,你無須大寫verbose_name的首字母,Django自動爲你完成這一工做。

validators

運行在該字段上的驗證器的列表。

相關文章
相關標籤/搜索