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模拟登录百度代码分享(获取百度贴吧等级)
Dec 27 Python
Python文件夹与文件的操作实现代码
Jul 13 Python
python实现telnet客户端的方法
Apr 15 Python
对于Python中RawString的理解介绍
Jul 07 Python
Python 包含汉字的文件读写之每行末尾加上特定字符
Dec 12 Python
python实现多人聊天室
Mar 31 Python
python遍历文件夹找出文件夹后缀为py的文件方法
Oct 21 Python
python 划分数据集为训练集和测试集的方法
Dec 11 Python
python使用pdfminer解析pdf文件的方法示例
Dec 20 Python
python Tcp协议发送和接收信息的例子
Jul 22 Python
Python爬取视频(其实是一篇福利)过程解析
Aug 01 Python
Python实现序列化及csv文件读取
Jan 19 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中for循环语句的几种变型
2006/11/26 PHP
PHP 日期时间函数的高级应用技巧
2009/10/10 PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
2012/10/06 PHP
使用javascript访问XML数据的实例
2006/12/27 Javascript
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
麦鸡的TAB切换功能结合了javascript和css
2007/12/17 Javascript
jQuery之ajax技术的详细介绍
2013/06/19 Javascript
使用js实现雪花飘落效果
2013/08/26 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
js clearInterval()方法的定义和用法
2015/11/11 Javascript
jQuery.form.js插件不能解决连接超时(timeout)的原因分析及解决方法
2016/10/14 Javascript
react系列从零开始_简单谈谈react
2017/07/06 Javascript
基于JavaScript实现无限加载瀑布流
2017/07/21 Javascript
Vue 组件注册实例详解
2019/02/23 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
2020/03/04 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
[01:33:30]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第二场 2月5日
2021/03/11 DOTA
Python urls.py的三种配置写法实例详解
2017/04/28 Python
Python爬虫包BeautifulSoup异常处理(二)
2018/06/17 Python
由面试题加深对Django的认识理解
2019/07/19 Python
Python实时监控网站浏览记录实现过程详解
2020/07/14 Python
通过代码实例了解Python sys模块
2020/09/14 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
介绍下WebSphere的安全性
2013/01/31 面试题
医学专业毕业生推荐信
2013/11/14 职场文书
2014学雷锋活动心得体会
2014/03/10 职场文书
委托书范本
2014/09/13 职场文书
如何签定毕业生就业协议书
2014/09/28 职场文书
刑事附带民事诉讼答辩状
2015/05/22 职场文书
2016年精神文明建设先进个人事迹材料
2016/02/29 职场文书
《岳阳楼记》原文、译文赏析
2019/09/10 职场文书
python中的被动信息搜集
2021/04/29 Python