二、Django創建數據庫模型
引用:
引用數據庫創建模塊from django.db import models
創建:
在models.py中創建的每一個類都為表,類變量即為表字段,類變量賦予的值相當於字段屬性。 創建的類需要繼承模塊方法:models.Model
字段說明:
- | 類型名稱 | 類方法 | widget | 必填參數 |
數值型 | int自增列 | AutoField | TextInput | primary_key=True |
bigint自增列 | BigAutoField | TextInput | primary_key=True | |
小整數(32768~32767) | SmallIntegerField | TextInput |
||
正小整型(0~32767) | PositiveSmallIntegerField | TextInput | ||
整數(-2147483648~2147483647) | IntegerField | TextInput | ||
正整數(0~2147483647) | PositiveIntegerField | TextInput | ||
長整型(-9223372036854775808~9223372036854775807) | BigIntegerField | TextInput | ||
浮點型 | FloatField | TextInput | ||
10進制小數 | DecimalField | TextInput |
max_digits: 小數總長度 |
|
二進制類型 | BinaryField | TextInput | ||
字符型 | 字符型 | CharField | TextInput | max_length |
文本類型 | TextField | Textarea | ||
Email類型(字符串) | EmailField | TextInput | ||
IP4&6類型(字符串) | GenericIPAddressField | TextInput | ||
URL類型(字符型) | URLField | TextInput | ||
字母、數字、下劃線、連接符(減號) | SlugField | TextInput | ||
逗號分割的數字 | CommaSeparatedIntegerField | TextInput | max_length | |
UUID類型(字符型) | UUIDField | TextInput | ||
文件型 | 提供讀取文件夾下文件 | FilePathField | CharField |
path |
它是一個 CharField ,它用來選擇文件系統下某個目錄裏面的某些文件。它有三個專有的參數,只有第一個參數是必須的: path: 這個參數是必需的。它是一個目錄的絕對路徑,而這個目錄就是 FilePathField 用來選擇文件的那個目錄。比如: "/home/images"。 match: 可選參數。它是一個正則表達式字符串, FilePathField 用它來過濾文件名稱,只有符合條件的文件才出現在文件選擇列表中。要註意正則表達式只匹配文件名,而不是匹配文件路徑。 例如:"foo.*\.txt$" 只匹配名為foo23.txt 而不匹配 bar.txt 和 foo23.gif。 recursive: 可選參數。它的值是 True 或 False。默認值是 False。它指定是否包含 path 下的子目錄。 allow_files: 該項屬於Django1.5新增內容。可選參數,它的值是 True 或 False。默認值是 True。它指定是否包含指定位置的文件。該項與allow_folders 必須有一個是 True。 allow_folders: Django1.5新增內容。可選參數,它的值是True或False。默認是False。它指定是否包含指定位置的目錄。該項與allow_files必須有一個是 True。 前面已經提到了 match 只匹配文件名稱,而不是文件路徑。所以下面這個例子:
FilePathField(path="/home/images", match="foo.*", recursive=True)?
將匹配 /home/images/foo.gif ,而不匹配 /home/images/foo/bar.gif。這是因為 match 只匹配文件名(foo.gif 和 bar.gif)。 默認情況下, FilePathField 實例在數據庫中的對應列是varchar(100) 。和其他字段一樣,你可以利用 max_length 參數改變字段的最大長度。 |
||||
文件上傳到指定目錄 | FileField | FileInput |
upload_to |
|
class FileField(upload_to=None[, max_length=100, **options]) Note:該字段不支持primary_key和unique 參數,否則會拋出TypeError 異常。 它有一個必須的參數: upload_to: 用於保存文件的本地文件系統。它根據 MEDIA_ROOT 設置確定該文件的 url 屬性。 該路徑可以包含 時間格式串strftime(),可以在上傳文件的時候替換成當時日期/時間(這樣,就不會出現在上傳文件把某個目錄塞滿的情況了)。 該參數也可以是一個可調用項,比如是一個函數,可以調用函數獲得包含文件名的上傳路徑。這個可調用項必須要接受兩個參數,並且返回一個保存文件用的 Unix-Style 的路徑(用/斜杠)。兩個參數分別是: instance :定義了當前 FileField 的 model 實例。更準確地說,就是以該文件為附件的 model 實例。 大多數情況下,在保存該文件時, model 實例對象還並沒有保存到數據庫,這是因為它很有可能使用默認的 AutoField,而此時它還沒有從數據庫中獲得主鍵值。 filename :上傳文件的原始名稱。在生成最終路徑的時候,有可能會用到它。 還有一個可選的參數: storage: 負責保存和獲取文件的對象。 默認的form widget是FileInput。 Note:在 model 中使用 FileField 或 ImageField 要按照以下的步驟:
例如,假設你的 MEDIA_ROOT 被設為 ‘/home/media‘,upload_to 被設為 ‘photos/%Y/%m/%d‘。 upload_to 中的 ‘%Y/%m/%d‘ 是一個strftime(),‘%Y‘ 是四位的年份,‘%m‘ 是兩位的月份,‘%d‘ 是兩位的日子。如果你在2007年01月15號上傳了一個文件,那麽這個文件就保存在/home/media/photos/2007/01/15 目錄下。 如果你想得到上傳文件的本地文件名稱,文件網址或是文件的大小,你可以使用 name, url 和 size 屬性。 Note:在上傳文件時,要警惕保存文件的位置和文件的類型,這麽做的原因是為了避免安全漏洞。對每一個上傳文件都要驗證,這樣你才能確保上傳的文件是你想要的文件。舉個例子,如果你盲目地讓別人上傳文件,而沒有對上傳文件進行驗證,如果保存文件的目錄處於 web 服務器的根目錄下,萬一有人上傳了一個 CGI 或是 PHP腳本,然後通過訪問腳本網址來運行上傳的腳本,那可就太危險了。千萬不要讓這樣的事情發生!默認情況下,FileField 實例在數據庫中的對應列是 varchar(100) ,和其他字段一樣,你可以利用max_length 參數改變字段的最大長度。 |
||||
圖片上傳到指定目錄 | ImageField | FileInput | upload_to | |
class ImageField(upload_to=None[, height_field=None, width_field=None, max_length=100,**options])和FileField一樣,只是會驗證上傳對象是不是一個合法的圖象文件。除了那些在FileField中有效的參數之外, ImageField 還可以使用 File.height and File.width 兩個屬性 。它有兩個可選參數:height_field:保存圖片高度的字段名稱。在保存對象時,會根據該字段設定的高度,對圖片文件進行縮放轉換。width_field:保存圖片寬度的字段名稱。在保存對象時,會根據該字段設定的寬度,對圖片文件進行縮放轉換。默認情況下,ImageField 實例對應著數據庫中的varchar(100) 列。和其他字段一樣,你可以使用max_length 參數來改變字段的最大長度。 | ||||
日期型 | 日期型 | DateField | TextInput |
auto_now auto_now_add |
日期時間型 | DateTimeField | TextInput | 同DateField | |
時間型 | TimeField | TextInput | 同DateField | |
布爾 | 布爾型 | BooleanField | CheckboxInput | |
空布爾 | NullBooleanField | NullBooleanSelect |
參數說明:
參數名稱 | 默認值 | 說明 |
null | False | 數據庫中字段是否可以為空 |
blank | django的Admin中添加數據時是否可允許空值 | |
primary_key | False | 主鍵,設置後,就會代替原來的自增 id 列 |
auto_now | 自動創建---無論添加或修改,都是當前操作的時間 | |
auto_now_add | 自動創建---永遠是創建時的時間 | |
choices | Admin中顯示選擇框的內容,用不變動的數據放在內存中從而避免跨表操作 | |
代碼如下: gf = models.IntegerField(choices=[(0, ‘何穗‘),(1, ‘大表姐‘),],default=1)?
|
||
default | 長度 | |
verbose_name | Admin中字段的顯示名稱 | |
db_column | 數據庫中的字段名稱 | |
unique | False | 不允許重復 |
db_index | False | 數據庫索引 |
editable | False | 在Admin裏是否可編輯 |
error_messages | 自定義錯誤信息(字典類型),從而定制想要顯示的錯誤信息; | |
字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date 如:{‘null‘: "不能為空.", ‘invalid‘: ‘格式錯誤‘} |
||
auto_created | False | 自動創建 |
help_text | 在Admin中提示幫助信息 | |
validators | 自定義錯誤驗證(列表類型),從而定制想要的驗證規則 | |
from django.core.validators import RegexValidator
from django.core.validators import EmailValidator,URLValidator,DecimalValidator,MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
#舉個聲明的例子如下:
test = models.CharField(
max_length=32,
error_messages={
‘c1‘: ‘優先錯信息1‘,
‘c2‘: ‘優先錯信息2‘,
‘c3‘: ‘優先錯信息3‘,
},
validators=[
RegexValidator(regex=‘root_\d+‘, message=‘錯誤了‘, code=‘c1‘),
RegexValidator(regex=‘root_112233\d+‘, message=‘又錯誤了‘, code=‘c2‘),
EmailValidator(message=‘又錯誤了‘, code=‘c3‘), ]
)
|
||
upload-to | 文件上傳路徑 |
外鍵說明:
一對多:models.ForeignKey(其他表)
一對多:當一張表中創建一行數據時,有一個單選的下拉框(可以被重復選擇)
例如:創建用戶信息時候,需要選擇一個用戶類型【普通用戶】【金牌用戶】【鉑金用戶】等。
代碼:
a=models.ForeignKey(to=‘TableName‘,to_field=‘id‘)
ForeignKey的參數:
參數名稱 | 參數說明 |
to=None, | 要進行關聯的表名 |
to_field=None, | 要關聯的表中的字段名稱 |
on_delete=None, |
當刪除關聯表中的數據時,當前表與其關聯的行的行為,內部可傳遞的變量有: - a. 與之關聯的值設置為指定值,設置:models.SET(值) |
related_name=None, | 反向操作時,使用的字段名,用於代替 【表名_set】 |
related_query_name=None, | 反向操作時,使用的連接前綴,用於替換【表名】 |
limit_choices_to=None, | 在Admin或ModelForm中顯示關聯數據時,提供的條件 |
db_constraint=True | 是否在數據庫中創建外鍵約束 |
parent_link=False | 在Admin中是否顯示關聯數據 |
多對多:models.ManyToManyField(其他表)
多對多:在某表中創建一行數據是,有一個可以多選的下拉框
例如:創建用戶信息,需要為用戶指定多個愛好
ManyToManyField參數:
參數名稱 | 參數說明 |
to=None |
要進行關聯的表名 |
related_name=None | 反向操作時,使用的字段名,用於代替 【表名_set】 如: obj.表名_set.all() |
related_query_name=None | 反向操作時,使用的連接前綴,用於替換【表名】 如: models.UserGroup.objects.filter(表名__字段名=1).values(‘表名__字段名‘) |
limit_choices_to=None |
在Admin或ModelForm中顯示關聯數據時,提供的條件: from django.db.models import Q - limit_choices_to=Q(nid__gt=10) - limit_choices_to=Q(nid=8) | Q(nid__gt=10) - limit_choices_to=lambda : Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption=‘root‘)? |
symmetrical=None | 僅用於多對多自關聯時,symmetrical用於指定內部是否創建反向操作的字段 |
through=None | 自定義第三張表時,使用字段用於指定關系表 |
through_fields=None |
自定義第三張表時,使用字段用於指定關系表中那些字段做多對多關系表: from django.db import models class Person(models.Model): name=models.CharField(max_length=50) class Group(models.Model): name=models.CharField(max_length=128) members=models.ManyToManyField( Person, through=‘Membership‘, through_fields=(‘group‘, ‘person‘), ) class Membership(models.Model): group=models.ForeignKey(Group, on_delete=models.CASCADE) person = models.ForeignKey(Person,on_delete=models.CASCADE) inviter=models.ForeignKey( Person, on_delete=models.CASCADE, related_name="membership_invites", ) invite_reason=models.CharField(max_length=64)?
|
db_constraint=True | 是否在數據庫中創建外鍵約束 |
db_table=None | 默認創建第三張表時,數據庫中表的名稱 |
一對一:models.OneToOneField(其他表)
一對一:在某表中創建一行數據時,有一個單選的下拉框(下拉框中的內容被用過一次就消失了)
例如:原有含10列數據的一張表保存相關信息,經過一段時間之後,10列無法滿足需求,需要為原來的表再添加5列數據
OneToOneField參數:
參數名稱 | 參數說明 |
to | 要進行關聯的表名 |
to_field=None | 要關聯的表中的字段名稱 |
on_delete=None | 當刪除關聯表中的數據時,當前表與其關聯的行的行為 |
二、Django創建數據庫模型