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判断字符串是否纯数字的方法
Nov 19 Python
在Python中利用Into包整洁地进行数据迁移的教程
Mar 30 Python
Python中的zipfile模块使用详解
Jun 25 Python
Python随机数random模块使用指南
Sep 09 Python
Python编程给numpy矩阵添加一列方法示例
Dec 04 Python
Python操作mongodb数据库进行模糊查询操作示例
Jun 09 Python
Python面向对象之继承和组合用法实例分析
Aug 27 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
Nov 07 Python
django创建超级用户过程解析
Sep 18 Python
python实现批量文件重命名
Oct 31 Python
Python基础类继承重写实现原理解析
Apr 03 Python
Python预测2020高考分数和录取情况
Jul 08 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模拟post行为代码总结(POST方式不是绝对安全)
2012/02/22 PHP
使用PHP获取当前url路径的函数以及服务器变量
2013/06/29 PHP
一漂亮的PHP图片验证码实例
2014/03/21 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
2014/09/09 PHP
禁止刷新,回退的JS
2006/11/25 Javascript
js中更短的 Array 类型转换
2011/10/30 Javascript
jQuery获取和设置表单元素的方法
2014/02/14 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
2014/03/22 Javascript
jQuery对val和atrr("value")赋值的区别介绍
2014/09/26 Javascript
JQuery替换DOM节点的方法
2015/06/11 Javascript
Javascript之BOM(window对象)详解
2016/05/25 Javascript
jQuery插件cxSelect多级联动下拉菜单实例解析
2016/06/24 Javascript
Javascript类型系统之undefined和null浅析
2016/07/13 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
js自制图片放大镜功能
2017/01/24 Javascript
详解angularjs中如何实现控制器和指令之间交互
2017/05/31 Javascript
基于JavaScript伪随机正态分布代码实例
2019/11/07 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
2020/01/18 Javascript
element-ui tree结构实现增删改自定义功能代码
2020/08/31 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
2020/09/11 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
2020/09/17 Javascript
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
python中定义结构体的方法
2013/03/04 Python
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
Python中判断输入是否为数字的实现代码
2018/05/26 Python
python保存数据到本地文件的方法
2018/06/23 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
2018/07/11 Python
Pandas GroupBy对象 索引与迭代方法
2018/11/16 Python
Python3多线程基础知识点
2019/02/19 Python
pytorch自定义二值化网络层方式
2020/01/07 Python
python在不同条件下的输入与输出
2020/02/13 Python
Django静态资源部署404问题解决方案
2020/05/11 Python
django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例
2020/05/12 Python
学生党员的自我评价范文
2014/03/01 职场文书
大学生村官演讲稿
2014/04/25 职场文书
工作说明书范文
2014/05/07 职场文书