本文參考自:django官方文檔models/field
在model中添加字段的格式一般為: field_name = field_type(**field_options)
一 field options(所有字段共用)
1 null 默認為False,True則表示可以為null。(空字符串在數據庫中可能被存儲為'')
2 blank 默認為False,True表示可以為空。
3 choice 可選的,限制了該選項的字段值必須是所指定的choice中的一個。

from django.db import models class Student(models.Model): FRESHMAN = 'FR' SOPHOMORE = 'SO' JUNIOR = 'JR' SENIOR = 'SR' YEAR_IN_SCHOOL_CHOICES = ( (FRESHMAN, 'Freshman'), #第一個參數是真正的model參數,#第二個參數則是方便人們理解閱讀 (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)
4 db_column 數據庫column名稱。默認為本字段的名稱。
5 db_index 如果為True的話,該字段的數據庫索引將會被創建
6 default 設置該字段的默認值,可以是值也可以是對象。
7 editable 默認為True,若為False,則不會在admin/界面顯示
8 primary_key 若設置為True,則表示將該字段設置為主鍵。一般情況下django默認會設置一個自增長的id主鍵。
9 unique 若設置為True,該字段值不可重復
二 field type(字段類型,細分的話可以分為普通字段以及關系字段)
1 普通字段
1 AutoField() 根據已有id自增長的整形唯一字段,一般每個model類不需設置該字段,因為django會為每個model自動設置。
django默認會為每個model類添加如下語句:id = models.AutoField(primary_key=True) 當其他字段添加了primary_key屬性,則不會創建id字段了
每個model類僅能有一個主鍵
2 BooleanField() 布爾型字段,默認的表單窗口部件是CheckBoxInput
3 CharField() 字符型字段,默認的表單窗口部件是TextInput。該字段類型有一個必需參數:max_length 在數據庫水平限定了字符串最大長度
4 DateField() 日期字段,字段的值是python中datetime.date的實例,默認的表單窗口是TextInput有幾個可選的參數:
auto_now=True/False:當設置為True時,每當該對象使用save()時,該字段的值就會被更新。
auto_now_add=True/False: 當設置為True時,該字段的值為該對象被創建時的日期
5 DateTimeField() 日期和時間字段,值為datetime.datetime實例。默認的表單窗口以及可選參數同上。
6 DecimalField() 混合精度的小數型數字字段。有兩個必需的參數:
max_digits=ingt_number:限定數字的最大位數(包含小數位)
decimal_places=int_number:存儲數字的小數位
#to store numbers up to 999 with a resolution of 2 decimal places, you’d use models.DecimalField(..., max_digits=5, decimal_places=2)
7 EmailField(max_length=254, **options) 郵件字段,使用EmailValidator進行驗證
8 FileField(upload_to=None, max_length=100, **options) 文件上傳字段。
這個字段不能設置primary_key和unique選項.在數據庫中存儲類型是varchar,默認最大長度為100.
有兩個可選參數:
upload_to
如果使用默認的FileSystomStorage,文件將會存儲到settings文件中配置的MEDIA_ROOT路徑中。
upload_to的值也可以為可調用對象,通過調用這個對象可以獲得上傳路徑。
instance=: 定義了FileField的模型實例
filename='': 文件名稱。

class MyModel01(models.Model): # file will be uploaded to MEDIA_ROOT/uploads upload = models.FileField(upload_to='uploads/') # or... # file will be saved to MEDIA_ROOT/uploads/2015/01/30 upload = models.FileField(upload_to='uploads/%Y/%m/%d/') #upload_to=可調用對象 def user_directory_path(instance, filename): # file will be uploaded to MEDIA_ROOT/user_<id>/<filename> return 'user_{0}/{1}'.format(instance.user.id, filename) class MyModel02(models.Model): upload = models.FileField(upload_to=user_directory_path)
storage 用來設定文件存儲倉庫
9 FilePathField(path=None, match=None, recursive=False, max_length=100, **options)
這個字段的值被限制在系統上某個目錄中的所有文件名集合中。有三個參數
path='': 該參數必需。上行所說的‘某個目錄’的絕對路徑。Example: "/home/images"
.
match='pattern': 可選參數。格式是正則表達式。用來揀選符合匹配正則表達式的文件
recursive=True/False: 可選參數,默認為False。設定是否遞歸該目錄下所有子目錄的所有文件。
FilePathField(path="/home/images", match="foo.*", recursive=True)
10 FloatField() 浮點字段,默認的表單窗口部件是NumberInput。和DecimalField經常混淆不清,
FloatField在內部使用Python中的float對象,而DecimalField在內部使用Python中的decimal對象。
11 ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options)
圖像字段。繼承了FileField的所有屬性和方法。而且還能自動驗證上傳的對象是否為合法的圖像。
12 IntegerField 整形字段。
13 GenericIPAddressField(protocol='both', unpack_ipv4=False, **options) ip地址字段
protocol='both/ipv4/ipv6' 默認為both
unpack_ipv4 用處不大。
14 NullBooleanField 類似於BooleanField,不同的是其允許值為null
15 TextField() 與CharField類似,但一般用來存儲體積較大的文本。
16 TimeField(auto_now=False, auto_now_add=False, **options) 時間字段,其值為datetime.time實例
17 URLField(max_length=200, **options) URL字段
類似於CharField的子類,默認最大長度為200.
18 UUIDField(**options) 通用唯一標識字段,當不想用django默認設置的AutoField字段時,可以用該字段代替。
2 關系字段
關系字段:一對一,多對一,多對多
一對一: 現在有很多一對一輔導班,也就是上課時,一個老師對應一個學生,一個學生對應一個老師
多對一: 很多偏遠山區的學校可能整個學校只有一個老師,這一個老師對應多個學生,所有的學生對應這一個老師
多對多: 而我們則很幸福,學校里有許多老師,一個老師教習一科,學生有多個老師,老師有多個學生。
1 ForeignKey(othermodel, on_delete, **options) 多對一或者一對多或者外鍵字段。
othermodel: 所關聯的模型,'多' model使用外鍵關聯 '一'model。
當所關聯的模型為他自己時,使用'self'
當引用的模型為其他app中的模型時,要加上app名稱標簽: 'app_name.model_name'
數據庫會自動在外鍵字段上創建索引,可以使用de_index=False關閉該功能。
on_delete: 當刪除 "一" 模型對象時,django會根據該參數的值對與該對象相關聯的其他對象(也就是 ‘多’)進行操作。
在django1.9以及之前的版本中,on_delete作為一個關鍵字參數。而在1.10則可以作為第二個參數
models.CASCADE: 默認為models.CASCADE 級聯刪除。當刪除'一'時,‘多’會被刪除。比如:

# mysite項目下名為polls的app中的models.py class follower(models.Model): name = models.CharField(max_length=200) menpai = models.ForeignKey('menpai', on_delete=models.CASCADE) #定義了models.CASCADE屬性 def __str__(self): return self.name class menpai(models.Model): name = models.CharField(max_length=200) def __str__(self): return self.name #運行 python3 manager.py shell進入交互頁面 >>> from polls.models import follower,menpai >>> m1=menpai(name='huashanpai') >>> m1.save() >>> m2=menpai(name='riyuejiao') >>> m2.save() >>> f1=follower(name='linghuchong',menpai=m1) >>> f1.save() >>> f2=follower(name='renwoxing',menpai=m2) >>> f2.save() >>> f1.menpai <menpai: huashanpai> >>> m1.delete() (2, {'polls.menpai': 1, 'polls.follower': 1}) # 刪除華山派時,將令狐沖也刪除了
modles.PROTECT : 當刪除一個具有外鍵關系的對象時,會引發一個異常,阻止刪除該對象
models.SET_NULL: 設置刪除對象所關聯的外鍵字段為null。但字段的null屬性必需為True
models.SET_DEFAULT : 設置刪除對象所關聯的外鍵字段為默認的值。
models.SET(value) :設置刪除對象所關聯的對象的外鍵字段為value,value也可以是一個可調用函數。

from django.conf import settings from django.contrib.auth import get_user_model from django.db import models def get_sentinel_user(): return get_user_model().objects.get_or_create(username='deleted')[0] class MyModel(models.Model): user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.SET(get_sentinel_user), )
models.DO_NOTHING : 不做任何操作
limit_choices_to 限制該字段為選項形。格式:limit_choices_to={'is_staff': True}。值也可以為可調用函數。

def limit_pub_date_choices(): return {'pub_date__lte': datetime.date.utcnow()} limit_choices_to = limit_pub_date_choices
related_name 設置從關聯對象到自身的關系的名稱,若值為'+' 則關聯對象與自身無逆向關系。詳解請看官方文檔。
to_field 設置所關聯對象的關聯字段。默認為關聯對象的主鍵字段。
2 ManyToManyField(othermodel, **options) 多對多字段。
othermodel: 所關聯的model名稱
db_table: 多對多關系會在兩個模型所對應的表中間創建一個‘中間表’ ,將多對多轉換為兩個多對一,該選項為這個中間表設置名稱。一般來說django會默認為中間表創建名稱,但人們讀起來可能搞不清楚究竟中間表關聯到了哪里。
related_name: 同多對一字段中的related_name
limite_choices_to: 同....
symmetrical: 當多對多關聯對象為自身時可能會用到的參數。默認為True。a,b同屬於person模型,person中的friends字段與自身設置了多對多關系,當該值設置為True時,django假定關系為對稱,即:a是b的朋友,那么b也是a的朋友。設置為False時,django會強制為逆向關系創建描述信息。
though: 不想讓django自動創建中間表,手動創建中間表所對應的model,通過though指定對應的model名稱。
though_field: 當though參數被使用時,該參數才會有效。指定使用哪些中間模型字段來確立兩個模型的多對多關系。
3 OneToOneField(othermodel, on_delete, parent_link=False, **options) 一對一字段。
othermodel: .......
on_delete:........
related_name:...........