Django模型类中关于外键关联一些小知识点

模型类如下:

Django模型类中关于外键关联一些小知识点

Django模型类中关于外键关联一些小知识点

Django模型类中关于外键关联一些小知识点

Roles模型类与Books模型类关联, 对于Roles模型类来说是 多对1关系(n个角色对应1本小说) 外键属性在Roles模型类中, 就是rbook,外键别名  related_name=‘book’ 

虽然Books模型类中表面上没有外键字段(外键属性 ), 但他其实有,  就是roles_set  因为有外键别名所以在这里就是: book

 

这模型类对应的数据库表中, 每一行都是一个类对象, 包含所有字段属性

一:Roles模型类中会有一个隐藏属性: rbook_id  值是整型, 是Books模型类中的id   是每个角色所属的小说的id, 这一点从数据库表中可以看到

Django模型类中关于外键关联一些小知识点

二: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也是同理

1, 原理: Roles.rbook  Roles类使用rbook类属性, 二rbook有事Books的类对象,可以拿到对应Books模型类中的对应小说的所有信息, 所以所以Roles.rbook.Books中属性   就可以拿到选中角色对应Books中对应小说的所有属性

2, 在序列化器中若想通过rbook字段拿到Books中对应小说的一些信息(如果只获取Books中的id或者书名, 直接用序列化器自带的两个方法就行, 注意一点, 要想用自带方法取得书名, Books类中需定义魔法方法__str__   并返回书名), 就需要再定义一个序列化器(序列化器不就是对象转字典吗, rbook就是Books的类对象)