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 相关文章推荐
详细介绍Ruby中的正则表达式
Apr 10 Python
python编写简单爬虫资料汇总
Mar 22 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
Jun 09 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
Dec 12 Python
python3爬虫获取html内容及各属性值的方法
Dec 17 Python
python下PyGame的下载与安装过程及遇到问题
Aug 04 Python
Django发送邮件功能实例详解
Sep 02 Python
python通过链接抓取网站详解
Nov 20 Python
python中for in的用法详解
Apr 17 Python
python代码中怎么换行
Jun 17 Python
python 线程的五个状态
Sep 22 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 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 图片上传代码
2011/09/13 PHP
浅析PHP程序设计中的MVC编程思想
2014/07/28 PHP
ThinkPHP连接数据库及主从数据库的设置教程
2014/08/22 PHP
WIN8.1下搭建PHP5.6环境
2015/04/29 PHP
php实现求相对时间函数
2015/06/15 PHP
PHP CURL使用详解
2019/03/21 PHP
jQuery异步验证用户名是否存在示例代码
2014/05/21 Javascript
javascript获取flash版本号的方法
2014/11/20 Javascript
JavaScript获取元素尺寸和大小操作总结
2015/02/27 Javascript
JavaScript 浏览器对象模型BOM使用介绍
2015/04/13 Javascript
解决jquery中动态新增的元素节点无法触发事件问题的两种方法
2015/10/30 Javascript
JS延时器提示框的应用实例代码解析
2016/04/27 Javascript
angular或者js怎么确定选中ul中的哪几个li
2017/08/16 Javascript
在小程序中使用腾讯视频插件播放教程视频的方法
2018/07/10 Javascript
微信小程序实现页面浮动导航
2019/01/28 Javascript
利用JS如何获取form表单数据
2019/12/19 Javascript
vue搜索页开发实例代码详解(热门搜索,历史搜索,淘宝接口演示)
2020/04/11 Javascript
详解vue v-model
2020/08/31 Javascript
vue3.0中setup使用(两种用法)
2020/12/02 Vue.js
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
Python字符串逐字符或逐词反转方法
2015/05/21 Python
python判断字符串编码的简单实现方法(使用chardet)
2016/07/01 Python
对Python定时任务的启动和停止方法详解
2019/02/19 Python
快速排序的四种python实现(推荐)
2019/04/03 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
python批量将excel内容进行翻译写入功能
2019/10/10 Python
浅析PEP570新语法: 只接受位置参数
2019/10/15 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
HTML5+JS实现俄罗斯方块原理及具体步骤
2013/11/29 HTML / CSS
护理专科毕业推荐信
2013/11/10 职场文书
装修活动策划方案
2014/08/27 职场文书
置业顾问岗位职责
2015/02/09 职场文书
撤诉书怎么写
2015/05/19 职场文书
导游词之江西赣州
2019/10/15 职场文书
微信小程序中wxs文件的一些妙用分享
2022/02/18 Javascript
JS前端canvas交互实现拖拽旋转及缩放示例
2022/08/05 Javascript