1. 程式人生 > >二、Django創建數據庫模型

二、Django創建數據庫模型

var 字母 -a 定制 idf 文件路徑 roo foreign members

引用:

引用數據庫創建模塊
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:

小數總長度
decimal_places:小數位長度

二進制類型 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 要按照以下的步驟:

  1. 在項目settings文件中,你要定義 MEDIA_ROOT ,將它的值設為用來存放上傳文件的目錄的完整路徑。(基於性能的考慮,Django 沒有將文件保存在數據庫中),然後定義 MEDIA_URL ,將它的值設為表示該目錄的網址。要確保 web 服務器所用的帳號擁有對該目錄的寫權限。
  2. 在 model 裏面添加 FileField 或 ImageField ,並且確認已定義了 upload_to 項,讓 Django 知道應該用MEDIA_ROOT的哪個子目錄來保存文件。
  3. 存儲在數據庫當中的僅僅只是文件的路徑(而且是相對於 MEDIA_ROOT 的相對路徑)。你可能已經想到利用Django 提供的 url 這個方便的屬性。舉個例子,如果你的 ImageField 名稱是 mug_shot,那麽你可以在模板中使用{{ object.mug_shot.url }}?就能得到圖片的完整網址。

例如,假設你的 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,

當刪除關聯表中的數據時,當前表與其關聯的行的行為,內部可傳遞的變量有:

- models.CASCADE:刪除關聯數據,與之關聯也刪除
- models.DO_NOTHING:刪除關聯數據,引發錯誤IntegrityError
- models.PROTECT:刪除關聯數據,引發錯誤ProtectedError
- models.SET_NULL:刪除關聯數據,與之關聯的值設置為null(前提FK字段需要設置為可空)
- models.SET_DEFAULT:刪除關聯數據,與之關聯的值設置為默認值(前提FK字段需要設置默認值)
- models.SET:刪除關聯數據:

a. 與之關聯的值設置為指定值,設置:models.SET(值)
b. 與之關聯的值設置為可執行對象的返回值,設置: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中顯示關聯數據時,提供的條件:
- limit_choices_to={‘nid__gt‘: 5}#
- limit_choices_to=lambda : {‘nid__gt‘: 5}

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創建數據庫模型