在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:...........
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/136650.html
標籤:Python
下一篇:求和,求平均數
