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 smtplib模块发送SSL/TLS安全邮件实例
Apr 08 Python
详解字典树Trie结构及其Python代码实现
Jun 03 Python
Python计算字符宽度的方法
Jun 14 Python
Python的时间模块datetime详解
Apr 17 Python
python实现日常记账本小程序
Mar 10 Python
解决python ogr shp字段写入中文乱码的问题
Dec 31 Python
dataframe 按条件替换某一列中的值方法
Jan 29 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
Apr 01 Python
Python时间序列处理之ARIMA模型的使用讲解
Apr 02 Python
Django网络框架之创建虚拟开发环境操作示例
Jun 06 Python
django formset实现数据表的批量操作的示例代码
Dec 06 Python
Python读写csv文件流程及异常解决
Oct 20 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+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
JavaScript的面向对象(二)
2006/11/09 Javascript
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
2016/02/19 Javascript
深入浅析jQuery对象$.html
2016/08/22 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
2016/11/25 Javascript
BootStrap轮播HTML代码(推荐)
2016/12/10 Javascript
防止重复发送 Ajax 请求
2017/02/15 Javascript
使用jQuery实现简单的tab框实例
2017/08/22 jQuery
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
原生javascript实现文件异步上传的实例讲解
2017/10/26 Javascript
JS实现将链接生成二维码并转为图片的方法
2018/03/17 Javascript
python网络编程学习笔记(一)
2014/06/09 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
2018/07/09 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
2020/01/09 Python
Python requests HTTP验证登录实现流程
2020/11/05 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
详解CSS3浏览器兼容
2016/12/14 HTML / CSS
HTML5之SVG 2D入门10—滤镜的定义及使用
2013/01/30 HTML / CSS
Linux文件系统类型
2012/09/16 面试题
现代化办公人员工作的自我评价
2013/10/16 职场文书
建筑毕业生自我鉴定
2013/10/18 职场文书
服装设计行业个人的自我评价
2013/12/20 职场文书
电大会计学自我鉴定
2014/02/06 职场文书
档案室主任岗位职责
2014/02/12 职场文书
公务员政审个人鉴定
2014/02/25 职场文书
应届大专生自荐书
2014/06/16 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书
预备党员考察意见范文
2015/06/01 职场文书
汉语拼音教学反思
2016/02/22 职场文书
Django使用echarts进行可视化展示的实践
2021/06/10 Python
JavaScript异步操作中串行和并行
2021/11/20 Javascript