該系列教程系個人原創(chuàng),并完整發(fā)布在個人官網劉江的博客和教程
所有轉載本文者,需在頂部顯著位置注明原作者及www.官網地址。
所有的模型字段都可以接收一定數量的參數,比如CharField至少需要一個max_length參數。下面的這些參數是所有字段都可以使用的,并且是可選的。
null
該值為True時,Django在數據庫用NULL保存空值。默認值為False。對于保存字符串類型數據的字段,請盡量避免將此參數設為True,那樣會導致兩種‘沒有數據’的情況,一種是NULL,另一種是‘空字符串’。
blank
True時,字段可以為空。默認False。和null參數不同的是,null是純數據庫層面的,而blank是驗證相關的,它與表單驗證是否允許輸入框內為空有關,與數據庫無關。所以要小心一個null為False,blank為True的字段接收到一個空值可能會出bug或異常。
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用字段名代替。對于下面的例子:
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)
使用方法:
>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'
db_column
該參數用于定義當前字段在數據表內的列名。如果未指定,Django將使用字段名作為列名。
db_index
該參數接收布爾值。如果為True,數據庫將為該字段創(chuàng)建索引。
db_tablespace
用于字段索引的數據庫表空間的名字,前提是當前字段設置了索引。默認值為工程的DEFAULT_INDEX_TABLESPACE 設置。如果使用的數據庫不支持表空間,該參數會被忽略。
default
字段的默認值,可以是值或者一個可調用對象。如果是可調用對象,那么每次創(chuàng)建新對象時都會調用。設置的默認值不能是一個可變對象,比如列表、集合等等。lambda匿名函數也不可用于default的調用對象,因為匿名函數不能被migrations序列化。
注意:在某種原因不明的情況下將default設置為None,可能會引發(fā)intergyerror:not null constraint failed ,即非空約束失敗異常,導致python manage.py migrate 失敗,此時可將None改為False或其它的值,只要不是None就行。
editable
如果設為False,那么當前字段將不會在admin后臺或者其它的ModelForm表單中顯示,同時還會被模型驗證功能跳過。參數默認值為True。
error_messages
用于自定義錯誤信息。參數接收字典類型的值。字典的鍵可以是null 、 blank 、 invalid 、 invalid_choice 、 unique 和unique_for_date 其中的一個。
help_text
額外顯示在表單部件上的幫助文本。使用時請注意轉義為純文本,防止腳本攻擊。
primary_key
如果你沒有給模型的任何字段設置這個參數為True,Django將自動創(chuàng)建一個AutoField自增字段,名為‘id’,并設置為主鍵。也就是id = models.AutoField(primary_key=True) 。
如果你為某個字段設置了primary_key=True,則當前字段變?yōu)橹麈I,并關閉Django自動生成id主鍵的功能。
primary_key=True 隱含null=False 和unique=True 的意思。一個模型中只能有一個主鍵字段!
另外,主鍵字段不可修改,如果你給某個對象的主鍵賦個新值實際上是創(chuàng)建一個新對象,并不會修改原來的對象。
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
日期唯一??赡懿惶美斫狻Ee個栗子,如果你有一個名叫title的字段,并設置了參數unique_for_date="pub_date" ,那么Django將不允許有兩個模型對象具備同樣的title和pub_date。有點類似聯合約束。
unique_for_month
同上,只是月份唯一。
unique_for_year
同上,只是年份唯一。
verbose_name
為字段設置一個人類可讀,更加直觀的別名。
對于每一個字段類型,除了ForeignKey 、ManyToManyField 和OneToOneField 這三個特殊的關系類型,其第一可選位置參數都是verbose_name 。如果沒指定這個參數,Django會利用字段的屬性名自動創(chuàng)建它,并將下劃線轉換為空格。
下面這個例子的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
運行在該字段上的驗證器的列表。
|