Django REST Framework序列化外键获取外键的值方法


Posted in Python onJuly 26, 2019

需求:序列化外键,获取外键的除id之外的值

使用Django REST Framework虽然开发接口快速,但是如果想要获取到除外键id值之外的外键信息,直接继承serializers.ModelSerializer类,然后在fields中指定返回的字段是获取不到外键的其他值的,比如我现在需要外键的name属性值,下面就给大家介绍两种方法通过序列化外键来获取我们想要的外键的值。

这里有两个Model:问卷(Questionnaire);问题(Question)。一张问卷中包含多个问题,问题通过外键关联对应的问卷。

model.py

class Questionnaire(models.Model):
 '''问卷'''
 title = models.CharField('标题',max_length=100)
 class Meta:
  verbose_name_plural = '所有问卷'
 
class Question(models.Model):
 '''问题'''
 #所属问卷
 questionnaire = models.ForeignKey(Questionnaire,verbose_name='所属问卷',related_name='questions')
 #问题标题
 title = models.CharField('问题',max_length=150)
 #是否是多选
 is_checkbox = models.BooleanField('是否多选',default=False,help_text='是否是多选问题')
 class Meta:
  verbose_name_plural = '问题'

serializers.py

from rest_framework import serializers
from question.models import Question,Questionnaire
 
class QuestionnaireSerializer(serializers.ModelSerializer):
 class Meta:
  model = Questionnaire
  fields = ('title',)
 
class QuestionSerializer(serializers.ModelSerializer):
 class Meta:
  model = Question
  fields = ('title','is_checkbox')

这是没有对外键进行序列化的代码,我们只能获得model中已有字段的值,那么现在我想通过QuestionSerializer这个序列化的类来得到其外键questionnaire的值(questionnaire_title),有一下两种方法实现

1.在序列化的时候创建一个新的字段(questionnaire_title)并且在这个字段中指定source=这个属性,具体操作如下

serializers.py

from rest_framework import serializers
from question.models import Question,Questionnaire,Choice
 
class QuestionnaireSerializer(serializers.ModelSerializer):
 class Meta:
  model = Questionnaire
  fields = ('title',)
 
class QuestionSerializer(serializers.ModelSerializer):
 questionnaire_title = serializers.CharField(source='questionnaire.title')
 questionnaire_id = serializers.IntegerField()
 class Meta:
  model = Question
  fields = ('title','is_checkbox','questionnaire_title','questionnaire_id')

第二个字段questionnaire_id之所以没有添加source=这个属性,是因为这个字段名跟model中的字段名一样,django会自动识别,如果把这个字段换为questionnaire_ID那么就需要设置source=这个属性。

2.直接在model中通过property装饰器创建一个名为questionnaire_title的函数,并在函数中返回我们想要拿到的信息如:questionnaire_name,questionnaire_id,然后在序列化时指定为ReadOnlyField()字段;具体操作如下

models.py

class Questionnaire(models.Model):
 '''问卷'''
 title = models.CharField('标题',max_length=100)
 class Meta:
  verbose_name_plural = '所有问卷'
 
class Question(models.Model):
 '''问题'''
 #所属问卷
 questionnaire = models.ForeignKey(Questionnaire,verbose_name='所属问卷',related_name='questions')
 #问题标题
 title = models.CharField('问题',max_length=150)
 #是否是多选
 is_checkbox = models.BooleanField('是否多选',default=False,help_text='是否是多选问题')
 class Meta:
  verbose_name_plural = '问题'
 
 @property
 def questionnaire_title(self):
  return self.questionnaire.title,self.questionnaire.id
serializers.py使用ReadOnly

from rest_framework import serializers
from question.models import Question,Questionnaire
 
class QuestionnaireSerializer(serializers.ModelSerializer):
 class Meta:
  model = Questionnaire
  fields = ('title',)
 
class QuestionSerializer(serializers.ModelSerializer):
 questionnaire_title = serializers.ReadOnlyField()
 questionnaire_id = serializers.ReadOnlyField()
 class Meta:
  model = Question
  fields = ('title','is_checkbox','questionnaire_title','questionnaire_id')

这就是通过序列化外键来获得外键信息的两种方法,总的来说两种方法都特别简单实用,只不过第二种方法要多写几行代码而已。

以上这篇Django REST Framework序列化外键获取外键的值方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python控制台显示时钟的示例
Feb 24 Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 Python
Python正则表达式经典入门教程
May 22 Python
关于python列表增加元素的三种操作方法
Aug 22 Python
Python sorted函数详解(高级篇)
Sep 18 Python
浅谈python3.x pool.map()方法的实质
Jan 16 Python
python读取图片任意范围区域
Jan 23 Python
python2.7的flask框架之引用js&css等静态文件的实现方法
Aug 22 Python
python实现局域网内实时通信代码
Dec 22 Python
在服务器上安装python3.8.2环境的教程详解
Apr 26 Python
详解查看Python解释器路径的两种方式
Oct 15 Python
pytorch 使用半精度模型部署的操作
May 24 Python
django admin.py 外键,反向查询的实例
Jul 26 #Python
Python企业编码生成系统之系统主要函数设计详解
Jul 26 #Python
python的re模块使用方法详解
Jul 26 #Python
Python企业编码生成系统总体系统设计概述
Jul 26 #Python
详解程序意外中断自动重启shell脚本(以Python为例)
Jul 26 #Python
python的pstuil模块使用方法总结
Jul 26 #Python
python爬虫项目设置一个中断重连的程序的实现
Jul 26 #Python
You might like
Terran魔法科技
2020/03/14 星际争霸
Wordpress 相册插件 NextGEN-Gallery 添加目录将中文转为拼音的解决办法
2010/12/29 PHP
PHP乱码问题,UTF-8乱码常见问题小结
2012/04/09 PHP
测试php连接mysql是否成功的代码分享
2014/01/24 PHP
php图片处理函数获取类型及扩展名实例
2014/11/19 PHP
thinkphp命名空间用法实例详解
2015/12/30 PHP
PHP生成静态HTML文档实现代码
2016/06/23 PHP
JS 操作符整理[推荐收藏]
2011/11/15 Javascript
js 如何实现对数据库的增删改查
2012/11/23 Javascript
ExtJS实现文件下载的方法实例
2013/11/09 Javascript
Javascript实现字数统计
2015/07/03 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
AngularJS基础 ng-repeat 指令简单示例
2016/08/03 Javascript
巧用数组制作图片切换js代码
2016/11/29 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
2016/12/30 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
2018/04/20 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
Vue加载组件、动态加载组件的几种方式
2018/08/31 Javascript
vue项目中使用bpmn为节点添加颜色的方法
2020/04/30 Javascript
vue+Element中table表格实现可编辑(select下拉框)
2020/05/21 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
Python学习小技巧之利用字典的默认行为
2017/05/20 Python
python学习笔记之列表(list)与元组(tuple)详解
2017/11/23 Python
Python命令行解析模块详解
2018/02/01 Python
python高效过滤出文件夹下指定文件名结尾的文件实例
2018/10/21 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
加拿大在线隐形眼镜和眼镜店:VisionPros
2019/10/06 全球购物
交通事故赔偿协议书范本
2014/04/15 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
世界水日宣传活动总结
2015/02/09 职场文书
企业法人代表证明书
2015/06/18 职场文书
python用字节处理文件实例讲解
2021/04/13 Python