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删除指定目录下过期文件的2个脚本分享
Apr 10 Python
详细介绍Python的鸭子类型
Sep 12 Python
Python实现将16进制字符串转化为ascii字符的方法分析
Jul 21 Python
python实现kmp算法的实例代码
Apr 03 Python
Pyqt5实现英文学习词典
Jun 24 Python
解决django同步数据库的时候app models表没有成功创建的问题
Aug 09 Python
python tkinter图形界面代码统计工具
Sep 18 Python
Python numpy.zero() 初始化矩阵实例
Nov 27 Python
Pytorch实现神经网络的分类方式
Jan 08 Python
django 取消csrf限制的实例
Mar 13 Python
python使用XPath解析数据爬取起点小说网数据
Apr 22 Python
python使用openpyxl库读写Excel表格的方法(增删改查操作)
May 02 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
php统计时间和内存使用情况示例分享
2014/03/13 PHP
yii的CURD操作实例详解
2014/12/04 PHP
PHP获取photoshop写入图片文字信息的方法
2015/03/31 PHP
从wamp到xampp的升级之路
2015/04/08 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
centos7上编译安装php7以php-fpm方式连接apache
2018/11/08 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
javascript 获取表单file全路径
2009/12/31 Javascript
JavaScript也谈内存优化
2014/06/06 Javascript
jquery判断iPhone、Android设备类型
2016/09/14 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
2016/10/13 Javascript
jQuery实现拖动剪裁图片作为头像
2016/12/28 Javascript
Jquery-data的三种用法
2017/04/18 jQuery
angular实现图片懒加载实例代码
2017/06/08 Javascript
Angularjs自定义指令实现分页插件(DEMO)
2017/09/16 Javascript
详解Angular6学习笔记之主从组件
2018/09/05 Javascript
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
Python3实现的字典遍历操作详解
2018/04/18 Python
PHP实现发送和接收JSON请求
2018/06/07 Python
Python基础之函数的定义与使用示例
2019/03/23 Python
python里运用私有属性和方法总结
2019/07/08 Python
Python Django form 组件动态从数据库取choices数据实例
2020/05/19 Python
DogBuddy荷兰:找到你最完美的狗保姆
2019/04/17 全球购物
澳大利亚有机化妆品网上商店:The Well Store
2020/02/20 全球购物
竞选大队委员演讲稿
2014/04/28 职场文书
爱之链教学反思
2014/04/30 职场文书
校运会口号
2014/06/18 职场文书
青春励志演讲稿范文
2014/08/25 职场文书
医院营销工作计划
2015/01/16 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书
python利用while求100内的整数和方式
2021/11/07 Python
Vue中Object.assign清空数据报错的解决方案
2022/03/03 Vue.js
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android
python数字图像处理:图像简单滤波
2022/06/28 Python