模型類如下:
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的類對象)