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 Trie树实现字典排序
Mar 28 Python
python正则表达式中的括号匹配问题
Dec 14 Python
Python中使用md5sum检查目录中相同文件代码分享
Feb 02 Python
python使用BeautifulSoup分页网页中超链接的方法
Apr 04 Python
Python爬取国外天气预报网站的方法
Jul 10 Python
Python+Turtle动态绘制一棵树实例分享
Jan 16 Python
Python实现接受任意个数参数的函数方法
Apr 21 Python
在CMD命令行中运行python脚本的方法
May 12 Python
python将txt文档每行内容循环插入数据库的方法
Dec 28 Python
基于wxPython的GUI实现输入对话框(1)
Feb 27 Python
Django+python服务器部署与环境部署教程详解
Mar 30 Python
Python列表元素删除和remove()方法详解
Jan 04 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 substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
2011/12/16 PHP
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
Smarty局部缓存的几种方法简介
2014/06/17 PHP
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
JavaScript While 循环基础教程
2007/04/05 Javascript
List the Codec Files on a Computer
2007/06/11 Javascript
JavaScript的变量作用域深入理解
2009/10/25 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
jQuery之DOM对象和jQuery对象的转换与区别分析
2015/01/08 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
基于webpack 实用配置方法总结
2017/09/28 Javascript
详解ionic本地相册、拍照、裁剪、上传(单图完全版)
2017/10/10 Javascript
Vue-不允许嵌套式的渲染方法
2018/09/13 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
关于layui时间回显问题的解决方法
2019/09/24 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
vue中使用WX-JSSDK的两种方法(推荐)
2020/01/18 Javascript
JavaScript实现网页留言板功能
2020/11/23 Javascript
Vue ​v-model相关知识总结
2021/01/28 Vue.js
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
Python使用django框架实现多人在线匿名聊天的小程序
2017/11/29 Python
Python线程同步的实现代码
2018/10/03 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
用CSS3实现无限循环的无缝滚动的实例代码
2017/07/04 HTML / CSS
原料仓管员岗位职责
2014/04/12 职场文书
新员工试用期自我鉴定
2014/04/17 职场文书
安全生产计划书
2014/05/04 职场文书
银行求职信
2014/05/31 职场文书
个人合作协议范本
2015/08/06 职场文书
三八节祝酒词
2015/08/11 职场文书
Python3 类型标注支持操作
2021/06/02 Python
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript
利用Python实现模拟登录知乎
2022/05/25 Python