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的Flask框架中验证注册用户的Email的方法
Sep 02 Python
简单讲解Python编程中namedtuple类的用法
Jun 21 Python
Python的string模块中的Template类字符串模板用法
Jun 27 Python
Python编程之序列操作实例详解
Jul 22 Python
关于Pycharm无法debug问题的总结
Jan 19 Python
python opencv minAreaRect 生成最小外接矩形的方法
Jul 01 Python
python创建n行m列数组示例
Dec 02 Python
Python和Anaconda和Pycharm安装教程图文详解
Feb 04 Python
Python使用进程Process模块管理资源
Mar 05 Python
解决python3.x安装numpy成功但import出错的问题
Nov 17 Python
Python基础之元编程知识总结
May 23 Python
如何使用python包中的sched事件调度器
Apr 30 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
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
ThinkPHP调用百度翻译类实现在线翻译
2014/06/26 PHP
[原创]CI(CodeIgniter)简单统计访问人数实现方法
2016/01/19 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
Javascript实例教程(19) 使用HoTMetal(5)
2006/12/23 Javascript
javascript parseInt 大改造
2009/09/27 Javascript
xml转json的js代码
2012/08/28 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
2013/09/04 Javascript
jquery和css3实现的炫酷时尚的菜单导航
2014/09/01 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
使用js实现数据格式化
2014/12/03 Javascript
JavaScript实现将xml转换成html table表格的方法
2015/04/17 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
bootstrap PrintThis打印插件使用详解
2017/02/20 Javascript
JavaScript实现省市县三级级联特效
2017/05/16 Javascript
vue实现重置表单信息为空的方法
2018/09/29 Javascript
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
2019/03/02 NodeJs
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
JavaScript实现图片伪异步上传过程解析
2020/04/10 Javascript
详解vue中v-model和v-bind绑定数据的异同
2020/08/10 Javascript
Python 中pandas.read_excel详细介绍
2017/06/23 Python
Flask框架使用DBUtils模块连接数据库操作示例
2018/07/20 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
Python利用WMI实现ping命令的例子
2019/08/14 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
flask 使用 flask_apscheduler 做定时循环任务的实现
2019/12/10 Python
吃透移动端 Html5 响应式布局
2019/12/16 HTML / CSS
英国最大的电子零件及配件零售商:Partmaster
2017/04/24 全球购物
大四毕业生学习总结的自我评价
2013/10/31 职场文书
酒店工程部主管岗位职责
2015/04/16 职场文书
2015入党自传格式范文
2015/06/26 职场文书
2015年小学教师培训工作总结
2015/07/21 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers
使用Ajax实现进度条的绘制
2022/04/07 Javascript