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 相关文章推荐
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
Jan 23 Python
Python3 正在毁灭 Python的原因分析
Nov 28 Python
Python实现自动上京东抢手机
Feb 06 Python
python实现在IDLE中输入多行的方法
Apr 19 Python
Python WSGI的深入理解
Aug 01 Python
Window 64位下python3.6.2环境搭建图文教程
Sep 19 Python
pygame库实现移动底座弹球小游戏
Apr 14 Python
Python 根据数据模板创建shapefile的实现
Nov 26 Python
Python使用pyexecjs代码案例解析
Jul 13 Python
Python爬虫实现自动登录、签到功能的代码
Aug 20 Python
Python可视化工具如何实现动态图表
Oct 23 Python
Python闭包的定义和使用方法
Apr 11 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 获取一个月第一天与最后一天的代码
2010/05/16 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
一个PHP的ZIP压缩类分享
2014/05/04 PHP
php实现将字符串按照指定距离进行分割的方法
2015/03/14 PHP
PHP中如何使用Redis接管文件存储Session详解
2018/11/28 PHP
IFrame跨域高度自适应实现代码
2012/08/16 Javascript
JavaScript函数作用域链分析
2015/02/13 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
MUI  Scroll插件的使用详解
2017/04/13 Javascript
JavaScript箭头函数_动力节点Java学院整理
2017/06/28 Javascript
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
2017/11/02 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
2017/11/03 Javascript
微信小程序WebSocket实现聊天对话功能
2018/07/06 Javascript
100行代码实现一个vue分页组功能
2018/11/06 Javascript
微信小程序实现顶部导航特效
2019/01/28 Javascript
详解如何运行vue项目
2019/04/15 Javascript
微信小程序iOS下拉白屏晃动问题解决方案
2019/10/12 Javascript
python编写简单爬虫资料汇总
2016/03/22 Python
python动态加载包的方法小结
2016/04/18 Python
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
彻底理解Python list切片原理
2017/10/27 Python
用于业余项目的8个优秀Python库
2018/09/21 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
对Python中小整数对象池和大整数对象池的使用详解
2019/07/09 Python
tesserocr与pytesseract模块的使用方法解析
2019/08/30 Python
Python 自动登录淘宝并保存登录信息的方法
2019/09/04 Python
python中从for循环延申到推导式的具体使用
2019/11/29 Python
python-numpy-指数分布实例详解
2019/12/07 Python
python列表生成器迭代器实例解析
2019/12/19 Python
python 基于selenium实现鼠标拖拽功能
2020/12/24 Python
python drf各类组件的用法和作用
2021/01/12 Python
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
百日安全活动总结
2014/05/04 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
学校世界艾滋病日宣传活动总结
2015/05/05 职场文书
2015年幼儿园国庆节活动总结
2015/07/30 职场文书