基於教程,劉江的部落格教程django教程:
filefield
imagefield
filepathfield
uuidfield
一,一對多
外來鍵要定義在『多』的一方!
1234567
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或異常。
1234567
891011
1213
1415
1617
1819
2021
2223
2425
2627
2829
30
choicesclass 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,資料庫將為該字段建立索引。
12
db_tablespacedefault
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引數
1234567
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欄位保持與祖先的關係,如下所示:
1234567
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,如果繼承的是乙個非抽象基類,那麼子類與父類之間不可以有相同的欄位名!
比如下面是不行的!
12345
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...