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程序的循环的运行效率的原因
Apr 01 Python
解决Linux系统中python matplotlib画图的中文显示问题
Jun 15 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
Feb 14 Python
pyqt5 删除layout中的所有widget方法
Jun 25 Python
python 获取等间隔的数组实例
Jul 04 Python
Python使用itchat 功能分析微信好友性别和位置
Aug 05 Python
Python自动化完成tb喵币任务的操作方法
Oct 30 Python
Python3打包exe代码2种方法实例解析
Feb 17 Python
Python中zipfile压缩包模块的使用
May 14 Python
python内置进制转换函数的操作
Jun 02 Python
python3操作redis实现List列表实例
Aug 04 Python
Python的三个重要函数详解
Jan 18 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&&mysql)六
2006/10/09 PHP
解析php中反射的应用
2013/06/18 PHP
PHP GD库生成图像的几个函数总结
2014/11/19 PHP
Codeigniter校验ip地址的方法
2015/03/21 PHP
php实现计算百度地图坐标之间距离的方法
2016/05/05 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
页面中js执行顺序
2009/11/09 Javascript
JavaScript.The.Good.Parts阅读笔记(一)假值与===运算符
2010/11/16 Javascript
javascript弹出页面回传值的方法
2015/01/28 Javascript
jQuery的animate函数实现图文切换动画效果
2015/05/03 Javascript
在JavaScript的jQuery库中操作AJAX的方法讲解
2015/08/15 Javascript
swtich/if...else的替代语句
2015/08/16 Javascript
javascript中return,return true,return false三者的用法及区别
2015/11/17 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
jsTree使用记录实例
2016/12/01 Javascript
Express + Session 实现登录验证功能
2017/09/08 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
javascript中undefined的本质解析
2019/07/31 Javascript
Python标准库之Sys模块使用详解
2015/05/23 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
django如何连接已存在数据的数据库
2018/08/14 Python
python实现多层感知器MLP(基于双月数据集)
2019/01/18 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
2019/10/24 Python
让你的Python代码实现类型提示功能
2019/11/19 Python
django使用F方法更新一个对象多个对象字段的实现
2020/03/28 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
Python CSS选择器爬取京东网商品信息过程解析
2020/06/01 Python
DataFrame 数据合并实现(merge,join,concat)
2020/06/14 Python
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
Puma印度官网:德国运动品牌
2019/10/06 全球购物
房地产销售计划书
2014/01/10 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
python - timeit 时间模块
2021/04/06 Python
ant design vue的form表单取值方法
2022/06/01 Vue.js