django學習筆記01

2021-10-06 06:17:06 字數 4660 閱讀 2688

基於教程,劉江的部落格教程django教程:

filefield

imagefield

filepathfield

uuidfield

一,一對多

外來鍵要定義在『多』的一方!

123

4567

8

parent_comment = models.foreignkey('self', on_delete=models.cascade)  

on_delete

limit_choices_to

related_name

related_query_name

to_field

db_constraint

二、多對多(manytomanyfield)

symmetrical

預設情況下,django中的多對多關係是對稱的。

django認為,如果我是你的朋友,那麼你也是我的朋友,這是一種對稱關係,django不會為person模型新增person_set屬性用於反向關聯。如果你不想使用這種對稱關係,可以將symmetrical設定為false,這將強制django為反向關聯新增描述符。

through_fields

membership模型中包含兩個關聯person的外來鍵,django無法確定到底使用哪個作為和group關聯的物件。所以,在這個例子中,必須顯式的指定through_fields引數,用於定義關係。

through_fields引數指定從中間表模型membership中選擇哪兩個字段,作為關係連線字段。

db_table

manytomanyfield多對多字段不支援django內建的validators驗證功能。

null引數對manytomanyfield多對多字段無效!設定null=true毫無意義

三、一對一(onetoonefield)

null

該值為true時,django在資料庫用null儲存空值。預設值為false。對於儲存字串型別資料的字段,請盡量避免將此引數設為true,那樣會導致兩種『沒有資料』的情況,一種是null,另一種是『空字串』。

blank

true時,字段可以為空。預設false。和null引數不同的是,null是純資料庫層面的,而blank是驗證相關的,它與表單驗證是否允許輸入框內為空有關,與資料庫無關。所以要小心乙個null為false,blank為true的字段接收到乙個空值可能會出bug或異常。

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

30

choices  

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,

) 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.shirt_size

p.get_shirt_size_display()

db_column

db_index

該引數接收布林值。如果為true,資料庫將為該字段建立索引。

1

2

db_tablespace  

default

unique_for_year

同上,只是年份唯一。

verbose_name

為字段設定乙個人類可讀,更加直觀的別名。

對於每乙個字段型別,除了foreignkey、manytomanyfield和onetoonefield這三個特殊的關係型別,其第一可選位置引數都是verbose_name。如果沒指定這個引數,django會利用欄位的屬性名自動建立它,並將下劃線轉換為空格。

下面這個例子的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來明確指定。如下:

抽象基類,多表繼承,**模型

抽象基類中的abstract=true這個元資料不會被繼承。也就是說如果想讓乙個抽象基類的子模型,同樣成為乙個抽象基類,那你必須顯式的在該子模型的meta中同樣宣告乙個abstract = true;

有一些元資料對抽象基類無效,比如db_table,首先是抽象基類本身不會建立資料表,其次它的所有子類也不會按照這個元資料來設定表名。

警惕related_name和related_query_name引數

123

4567

89

class base(models.model):

m2m = models.manytomanyfield(

othermodel,

)class meta:

abstract = true

如果乙個place物件同時也是乙個restaurant物件,你可以使用小寫的子類名,在父類中訪問它,

meta和多表繼承

由於父類和子類都在資料庫內有物理存在的表,父類的meta類會對子類造成不確定的影響,因此,django在這種情況下關閉了子類繼承父類的meta功能。這一點和抽象基類的繼承方式有所不同。

但是,還有兩個meta元資料特殊一點,那就是ordering和get_latest_by,這兩個引數是會被繼承的。因此,如果在多表繼承中,你不想讓你的子類繼承父類的上面兩種引數,就必須在子類中顯示的指出或重寫

多表繼承和反向關聯

三、 **模型

宣告乙個**模型只需要將meta中proxy的值設為true。

四、 多重繼承

django的模型體系支援多重繼承,就像python一樣。如果多個父類都含有meta類,則只有第乙個父類的會被使用,剩下的會忽略掉。

一般情況,能不要多重繼承就不要,盡量讓繼承關係簡單和直接,避免不必要的混亂和複雜。

請注意,繼承同時含有相同id主鍵欄位的類將丟擲異常。為了解決這個問題,你可以在基類模型中顯式的使用autofield欄位。

或者使用乙個共同的祖先來持有autofield欄位,並在直接的父類裡通過乙個onetoone欄位保持與祖先的關係,如下所示:

123

4567

891011

1213

class piece(models.model):

pass

class article(piece):

article_piece = models.onetoonefield(piece, on_delete=models.cascade, parent_link=true)

...class book(piece):

book_piece = models.onetoonefield(piece, on_delete=models.cascade, parent_link=true)

...class bookreview(book, article):

pass

警告在python語言層面,子類可以擁有和父類相同的屬性名,這樣會造成覆蓋現象。但是對於django,如果繼承的是乙個非抽象基類,那麼子類與父類之間不可以有相同的欄位名!

比如下面是不行的!

123

45

class a(models.model):

name = models.charfield(max_length=30)

class b(a):

name = models.charfield(max_length=30)

Django入門 學習筆記01

開啟瀏覽器 向目標url傳送乙個http請求 伺服器把頁面響應給瀏覽器 本質是網路通訊,即通過網路進行資料傳遞 瀏覽器經過通訊後獲取到該頁面的源 文件 瀏覽器解析文件後以適當的形式展示給使用者 django專案開發 檢視可用命令 在manage.py當前目錄下執行 python manage.py目...

django學習 流程01

django 流程 1 安裝python 如果版本比較新 會自動安裝pip 2 安裝虛擬機器 3 安裝虛擬環境 myproject 為環境名稱 mkvirtualenv myproject 4 執行虛擬環境 myproject 為環境名稱 workon myproject 5 安裝django框架 ...

Django學習筆記

django web程式設計思路 global setting run server check environment start project django admin.py startproject mysite 生成專案檔案 manage.py 檔案基本就是 django admin.py...