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打印scrapy蜘蛛抓取树结构的方法
Apr 08 Python
基于asyncio 异步协程框架实现收集B站直播弹幕
Sep 11 Python
django 解决manage.py migrate无效的问题
May 27 Python
python 制作自定义包并安装到系统目录的方法
Oct 27 Python
python 多线程对post请求服务器测试并发的方法
Jun 13 Python
Python登录系统界面实现详解
Jun 25 Python
Django基础知识 web框架的本质详解
Jul 18 Python
python快速编写单行注释多行注释的方法
Jul 31 Python
python带参数打包exe及调用方式
Dec 21 Python
解决python3插入mysql时内容带有引号的问题
Mar 02 Python
python实现梯度下降和逻辑回归
Mar 24 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
Jun 15 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函数
2006/10/09 PHP
php 取得瑞年与平年的天数的代码
2009/08/10 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
Centos PHP 扩展Xchche的安装教程
2016/07/09 PHP
PHP后端银联支付及退款实例代码
2017/06/23 PHP
Add a Table to a Word Document
2007/06/15 Javascript
一款jquery特效编写的大度宽屏焦点图切换特效的实例代码
2013/08/05 Javascript
多个jquery.datatable共存,checkbox全选异常的快速解决方法
2013/12/10 Javascript
js document.write()使用介绍
2014/02/21 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
2017/04/14 Javascript
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
微信小程序云开发详细教程
2019/05/16 Javascript
vue之延时刷新实例
2019/11/14 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
JavaScript变量Dom对象的所有属性
2020/04/30 Javascript
python获取beautifulphoto随机某图片代码实例
2013/12/18 Python
Python os模块介绍
2014/11/30 Python
Python计算一个文件里字数的方法
2015/06/15 Python
利用Python如何生成hash值示例详解
2017/12/20 Python
django多个APP的urls设置方法(views重复问题解决)
2019/07/19 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
python 实现turtle画图并导出图片格式的文件
2019/12/07 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
Python xpath表达式如何实现数据处理
2020/06/13 Python
python模块如何查看
2020/06/16 Python
Guess欧洲官网:美国服饰品牌
2019/08/06 全球购物
面向对象编程是如何提高软件开发水平的
2014/05/06 面试题
《我为你骄傲》教学反思
2014/02/20 职场文书
安全标语口号
2014/06/09 职场文书
2014年商场工作总结
2014/11/22 职场文书
迎国庆主题班会
2015/08/17 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书
七年级作文之英语老师
2019/10/28 职场文书