Django模型類中關於外鍵關聯一些小知識點

模型類如下:

Roles模型類與Books模型類關聯, 對於Roles模型類來說是 多對1關係(n個角色對應1本小說) 外鍵屬性在Roles模型類中, Roles中外建是就是rbook,外鍵別名  related_name=‘book’ 

雖然Books模型類中表面上沒有外鍵字段(外鍵屬性 ), 但他其實有,  就是roles_set  因爲有外鍵別名所以在這裏Books中的外鍵就是就是: book

 

這模型類對應的數據庫表中, 每一行都是一個類對象, 包含所有字段屬性

比如: role = Roles.objects.get(rname='葉修')  這裏role就是一個類對象, role中包含葉修的所有信息, 可以通過role.rage, role.source  等通過 . 來獲取屬性

一:Roles模型類中會有一個隱藏屬性: rbook_id  值是整型, 是Books模型類中的id   是每個角色所屬的小說的id, 這一點從數據庫表中可以看到

二:Roles中的rbook字段類型(外鍵屬性)是一個類對象, 是Books類的類對象, 包含Books對應小說中的所有信息, 這纔是真正的隱藏屬性, 這個字段真實存在, 但是數據庫表中卻不會顯示. 因爲這是一個類對象, 數據庫表中也沒發顯示. 所以Roles.rbook.Books中屬性   就可以拿到選中角色對應Books中對應小說的所有屬性

什麼叫選中角色對應Books中小說的所有屬性呢?

舉個例子就明白了

假如說, 我們要找蕭瑟屬於哪本小說,並返回小說的名字和作者(根據角色找小說)

首先先確定蕭瑟這個角色:

role = Roles.objects.get(rname='蕭瑟')   這就找到了蕭瑟這個角色, role是一個類對象, 這個類對象包含蕭瑟一行的所有東西,自然也包含蕭瑟這個一行的rbook字段

其次根據角色找小說

roles.rbook.bname    : 這就是小說名字

roles.rbook.writer      : 這就是小說作者

 

所以  蕭瑟這個role對象中的rbook是包含Books中少年歌行那一行的所有數據, 而不是Books中的所有數據

Books中的外鍵屬性book也是同理, 因爲有related_name = 'rbooks',所以在Books模型類中, rbook也是一個隱藏屬性

1, 原理: Roles.rbook  Roles類使用rbook類屬性, 二rbook有事Books的類對象,可以拿到對應Books模型類中的對應小說的所有信息, 所以所以Roles.rbook.Books中屬性   就可以拿到選中角色對應Books中對應小說的所有屬性

2, 在序列化器中若想通過rbook字段拿到Books中對應小說的一些信息(如果只獲取Books中的id或者書名, 直接用序列化器自帶的兩個方法就行, 注意一點, 要想用自帶方法取得書名, Books類中需定義魔法方法__str__   並返回書名), 就需要再定義一個序列化器(序列化器不就是對象轉字典嗎, rbook就是Books的類對象)

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章